1. 程式人生 > 其它 >linux下redis安裝與使用,redis資料型別

linux下redis安裝與使用,redis資料型別

NoSQL資料庫

NoSQL,泛指非關係型的資料庫,它可以作為關係型資料庫的良好補充。隨著網際網路web2.0網站的興起,傳統的關係資料庫在應付web2.0網站,特別是超大規模和高併發的SNS型別的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的資料庫則由於其本身的特點得到了非常迅速的發展。

​ NoSQL資料庫的產生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用難題。noSql資料庫說白了就是不能使用sql了,不是關係型資料庫,解決高併發的問題。因為像mysql或oracle單機能夠承受的併發數最多也就幾千

主流NoSQL

NoSQL資料庫的四大分類如下:

  • 鍵值(Key-Value)儲存資料庫(map)

    • 相關產品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB

      典型應用: 內容快取,主要用於處理大量資料的高訪問負載。

      資料模型: 一系列鍵值對

      優勢: 快速查詢

      劣勢: 儲存的資料缺少結構化,需要自己設計

  • 列儲存資料庫

    • 相關產品:Cassandra, HBase, Riak

      典型應用:大資料下分散式的檔案系統

      資料模型:以列簇式儲存,將同一列資料存在一起

      優勢:查詢速度快,可擴充套件性強,更容易進行分散式擴充套件

      劣勢:功能相對侷限

  • 文件型資料庫

    • 相關產品:CouchDB、MongoDB

      典型應用:Web應用(與Key-Value類似,Value是結構化的 bson) user1001 {“username”:”admin”,”age”:12}

      資料模型: 一系列鍵值對

      優勢:資料結構要求不嚴格

      劣勢: 查詢效能不高,而且缺乏統一的查詢語法

  • 圖形(Graph)資料庫

    • 相關資料庫:Neo4J、InfoGrid、Infinite Graph

      典型應用:社交網路

      資料模型:圖結構

      優勢:利用圖結構相關演算法。

      劣勢:需要對整個圖做計算才能得出結果,不容易做分散式的叢集方案。

什麼是redis

​ Redis是用C語言開發的一個開源的高效能鍵值對(key-value)資料庫。它通過提供多種鍵值資料型別來適應不同場景下的儲存需求,目前為止Redis支援的鍵值資料型別如下:

  • 字串型別 string

  • 雜湊型別 hash

  • 列表型別 list

  • 集合型別 set

  • 有序集合型別 sortedSet。

redis應用場景

  • 內容快取(資料查詢、短連線、新聞內容、商品內容等等)。(最多使用)

  • 分散式叢集架構中的session分離。

  • 聊天室的線上好友列表。

  • 任務佇列。(秒殺、搶購、12306等等) 100件iphonex免費贈送,

  • 應用排行榜。

  • 網站訪問統計。

  • 資料過期處理(可以精確到毫秒)

redis安裝步驟

1:wget 線上下載tar包或者scp一份到centos7環境
2:tar -zxvf redis-4.0.9.tar.gz
3:cd redis-4.0.9
4:make
5:make PREFIX=/usr/app/redis install
6:cp /usr/app/redis-4.0.9/redis.conf /usr/app/redis/bin/
7: cd /usr/app/redis/bin
9:./redis-server redis.conf
10: ./redis-cli -h 127.0.0.1 -p 6379
11:set test libai
12:get test
13:del test

redis的三種連線方式
1:./redis-cli -h ip地址 -p 埠號
關閉redis 伺服器
通過客戶端傳送shutdown的指令
2:通過視覺化工具 進行連線(注意:遠端連線需要修改redis.conf的配置)
1:將 bind 127.0.0.1 註釋掉
2:將 protected-mode 改成no
修改資料庫數量 databases 16 改成1
可以設定redis的訪問密碼 requirepass 密碼
daemonize yes 修改成後臺執行
3:通過java客戶端(java端大多都使用jedis jar包
)也可以連線redis資料庫

redis需要單機多開麼?
redis是單執行緒的key value資料庫,多開可以合理利用redis資源(redis叢集的時候)

redis資料型別與命令

1.string

​ redis中沒有使用C語言的字串表示,而是自定義一個數據結構叫SDS(simple dynamic string)即簡單動態字串

//賦值與取值  set key value  get key value
set test 1234
get test 
Jedis jedis = new Jedis("192.168.192.3",6379);
jedis.set("test","123456");
System.out.println(jedis.get("test"));

//遞增數字incr key(如果存的是數字) 
incr test 
jedis.incr("test");
//增加指定的整數incrby key number
incrby test 2
jedis.incrBy("test",2);
//減少整數decr key   
decr test 
jedis.decr("test");
//減少指定的數字decrby key  number
decrby key test 2    
jedis.decrBy("test",2);

//向尾部追加值append key value
append test "world"
jedis.set("test","hello");
jedis.append("test"," world!");
System.out.println(jedis.get("test"));

//獲取字串長度strlen key
strlen test
System.out.println(jedis.strlen("test"));

//同時設定/獲取多個鍵值 mset key value key value  mget key key key
jedis.mset("1","1","2","2","3","3");
System.out.println(jedis.mget("1","2","3"));

//自增主鍵(自己拼接)
set its:id 1
its:1  2
its:2  2
String key=”its:”+request.getParameter(“id”);
String value=jedis.get(key);

2.hash

  • Map<String,HashMap<String,String>>

使用String出現的問題

User:1 {“id”:1,“username”:zhangsan,”age”:20}

更新id為1的使用者,年齡更改為22

User物件---JSON(string)----redis

如果只修改age,不修改其他屬性會造成資源的浪費

  • hash叫雜湊型別,它提供了欄位和欄位值的對映。欄位值只能是字串型別,不支援雜湊型別、集合型別等其它型別。

User:1 username zhangsan

​ Password 123456

​ Age 23

//hset 一次設定一個值     hget一次獲取一個值
//hmset 一次設定多個值		hmget一次獲取多個值
//賦值與取值 hmset key key1 value key2 value  hmget key key1 key2
hmset a name zhangsan age 20
hmget a name age
Map map =  new HashMap();
map.put("name","zhangsan");
map.put("age","20");
jedis.hmset("a",map);
System.out.println(jedis.hmget("a","name","age"));
//獲取所有屬性 hgetall key
System.out.println(jedis.hgetAll("a"));

//判斷欄位是否存在 hexists key key1
hexists a age
System.out.println(jedis.hexists("a","age"));

//當欄位不存在時賦值 hsetnx key key1 value1
hsetnx a age 22
jedis.hsetnx("a","age","22");
System.out.println(jedis.hget("a","age"));

//增加數字hincrby key key1 number
hincrby a age 2
hget a age
jedis.hincrBy("a","age",2);
System.out.println(jedis.hget("a","age"));

//刪除欄位 刪除一個或多個,返回值是被刪除的欄位個數
//hdel key key1 key2
jedis.hdel("a","name");

//只獲取欄位名或欄位值hkeys key  hvals key
hkeys a 
hvals a
System.out.println(jedis.hkeys("a"));
System.out.println(jedis.hvals("a"));
//獲取欄位數量hlen key
hlen a
System.out.println(jedis.hlen("a"));
  • 應用 存放商品資訊

3.list

  • ArrayList與linkedList的區別
    • ArrayList使用陣列方式儲存資料,開闢儲存空間時,需要連續的儲存空間,所以根據索引查詢資料速度快,而新增或者刪除元素時需要設計到位移操作,所以比較慢。
    • LinkedList使用雙向連結方式儲存資料,不需要連續的儲存空間,每個元素都記錄前後元素的指標,所以插入、刪除資料時只是更改前後元素的指標指向即可,速度非常快,然後通過下標查詢元素時需要從頭開始索引,所以比較慢,但是如果查詢前幾個元素或後幾個元素速度比較快。
//向列表兩端增加元素lpush key value1 value2   rpush key value1 value2
jedis.lpush("b","1","2","3");
jedis.rpush("b","1","2","3");
//獲取列表片段 lrange list startindex endindex
System.out.println(jedis.lrange("b",0,-1));

//從列表兩端彈出元素lpop key     rpop key
jedis.lpop("b");
jedis.rpop("b");
System.out.println(jedis.lrange("b",0,-1));

//獲取列表中元素的個數 llen key
System.out.println(jedis.llen("b"));

//刪除列表中指定的值 krem key count value
//當count>0時, LREM會從列表左邊開始刪除。 
//當count<0時, LREM會從列表後邊開始刪除。 
//當count=0時, LREM刪除所有值為value的元素。
jedis.lrem("b",2,"2");
System.out.println(jedis.lrange("b",0,-1));

//獲取/設定指定索引的元素值lindex key index lset key index value
System.out.println(jedis.lindex("b",2));
jedis.lset("b",2,"3");

//只保留列表指定片段,指定範圍和lrange一致 ltrim key start stop


//向列表中插入元素 linsert key before|after pivot value
該命令首先會在列表中從左到右查詢值為pivot的元素,然後根據第二個引數是BEFORE還是AFTER來決定將value插入到該元素的前面還是後面

    
//將元素從一個列表轉移到另一個列表中 rpoplpush list newlist
    

  • 應用商品評論列表

還可以實現搶購秒殺的場景:充當一個佇列(先進先出) lpush rpop

還可以做使用者的商品評論.

思路:

在redis中建立商品評論列表

使用者釋出商品評論,將評論資訊轉成json儲存到list中。

使用者在頁面查詢評論列表,從redis中取出json資料展示到頁面。

Items:商品id hash型別

Items:comments:商品id '{"id":1,"name":"商品不錯,很好!!","date":1430295077289}'

'{"id":2,"name":"垃圾!!","date":1430295077289}'

定義商品評論列表key:

商品編號為1001的商品評論key:items: comment:1001

192.168.101.3:7001> LPUSH items:comment:1001 '{"id":1,"name":"商品不錯,很好!!","date":1430295077289}'

4.set

Java當中的set是一個介面,無序不可重複

集合型別的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在等,由於集合型別的Redis內部是使用值為空的散列表實現,所有這些操作的時間複雜度都為0(1)。

Redis還提供了多個集合之間的交集、並集、差集的運算。

//增加刪除元素 sadd key member member

//獲得集合中所有元素 smember key

//判斷元素是否在集合中 sismember key member

5.sorted set Zset

在集合型別的基礎上有序集合型別為集合中的每個元素都關聯一個分數,這使得我們不僅可以完成插入、刪除和判斷元素是否存在在集合中,還能夠獲得分數最高或最低的前N個元素、獲取指定分數範圍內的元素等與分數有關的操作。

在某些方面有序集合和列表型別有些相似。

1、二者都是有序的。

2、二者都可以獲得某一範圍的元素。

但是,二者有著很大區別:

1、列表型別是通過連結串列實現的,獲取靠近兩端的資料速度極快,而當元素增多後,訪問中間資料的速度會變慢。

2、有序集合型別使用散列表實現,所有即使讀取位於中間部分的資料也很快。

3、列表中不能簡單的調整某個元素的位置,但是有序集合可以(通過更改分數實現)

4、有序集合要比列表型別更耗記憶體。

//增加元素向有序集合中加入一個元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,不包含之前已經存在的元素。zadd key score member

//獲取元素的分數zscore key member

//獲得排名在某個範圍的元素列表 zrange key start stop withscores