1. 程式人生 > >Redis系列之----Redis的資料型別及使用場景

Redis系列之----Redis的資料型別及使用場景

   Redis是一個開源的、高效能的、基於鍵值對的快取與儲存系統,能夠提供多種不同的鍵值資料型別來適應不同場景下的快取和儲存需求。

   Redis中所有的資料都儲存在記憶體中,因此讀寫速度非常快,相比基於資料庫的磁碟讀寫具有非常明顯的優勢,但是,由於Redis是儲存在記憶體中的,儲存資料的大小會受到記憶體的限制,而且如果伺服器宕機的話資料將會丟失,當然,Redis也提供了持久化的機制來保證資料的恢復。

Redis中提供了多重的鍵值型別,到目前為止,Redis支援的鍵值型別如下:

  • 字串型別 string
  • 雜湊型別 hash
  • 列表型別 list
  • 集合型別 set
  • 有序集合型別 sorted sort

字串型別

   字串型別是Redis中最基本的型別,能夠儲存任何形式的字串,包括二進位制資料,一個字串型別允許儲存的資料最大容量為512M。
字串型別資料使用非常簡單,使用set和get命令可以對一個key進行賦值和取值操作。假設有一個name=“lczd”的資料,在Redis中可以這樣儲存:

賦值:
127.0.0.1:6379> set name lczd
OK
取值:
127.0.0.1:6379> get name
"lczd"

   當鍵不存在時會返回空結果。redis可以儲存任何形式的字串,包括整數形式,redis提供了incr命令來遞增當前的鍵值。
如:

127.0.0.1:6379> incr num
(integer) 1

如果鍵值不是整數時會提示錯誤。

還可以同時獲得或者設定多個鍵值,如:

127.0.0.1:6379> mset name lczd age 18
OK
127.0.0.1:6379> mget name age
1) "lczd"
2) "18"

使用場景:

適合使用簡單的string型別的key-value快取場景。

hash型別

   Redis是採用字典結構以鍵值對形式儲存資料結構的,hash也是一種字典結構,儲存了欄位(field)和欄位的對映,但是欄位值只能是字串,不能是其他型別。

雜湊型別適合儲存物件,例如,一條商品的評價可能會存在多個回覆。那麼,就可以用評價的id作為key,回覆id作為field,回覆物件作為hash的value。
hahs型別的賦值和取值操作:

hset key field value;
hget key fiel;

同時設定多個值可以用:hmset命令。

127.0.0.1:6379> hset shoes price 300
(integer) 1
127.0.0.1:6379> hset shoes colour blue
(integer) 1
127.0.0.1:6379> hget shoes price
"300"
127.0.0.1:6379> hgetAll shoes
1) "price"
2) "300"
3) "colour"
4) "blue"

使用場景:

適合儲存結構化的資訊,如物件型別的資訊。

列表型別

   列表型別可以儲存一個有序的字串列表,常用的操作是向列表的兩端新增元素或者獲得列表的某一個片段。
   列表型別內部使用的是雙向列表實現的,對列表兩端新增元素的時間複雜度為O(1)。獲取越接近頭部或者尾部的n條記錄就越快。但是使用連結串列的缺點是通過索引訪問元素比較慢。使用方式如下:

向列表兩端新增元素和獲取元素:

127.0.0.1:6379> lpush number 1
(integer) 1
127.0.0.1:6379> lpush number 2
(integer) 2
127.0.0.1:6379> rpush number 3
(integer) 3
127.0.0.1:6379> rpush number 4
(integer) 4
127.0.0.1:6379> lrange number 0 2
1) "2"
2) "1"
3) "3"

從列表刪除一個元素,比如去掉左邊的第一個元素:

127.0.0.1:6379> lpop number
"2"
127.0.0.1:6379> lrange number 0 2
1) "1"
2) "3"
3) "4"

使用場景:

   根據列表型別的特點,還可以用來實現任務佇列,比如讓生產者將任務使用lpush命令加入到某個鍵中,另一邊讓消費者不斷的使用prop命令從該鍵中取出值即可。還可以在需要展示某些列表資料的場景下使用。

集合型別

   集合型別中的每一個元素都是不同的,且集合沒有順序,集合型別的常用操作是向集合新增或者刪除元素、判斷某個元素是否存在等。

增加刪除元素:

127.0.0.1:6379> sadd dress blue
(integer) 1
127.0.0.1:6379> sadd dress blue  white red
(integer) 2

因為blue已經存在了,所以返回的是2

獲取所有元素:

127.0.0.1:6379> smembers dress
1) "white"
2) "red"
3) "blue"

刪除元素:

127.0.0.1:6379> srem dress blue
(integer) 1

使用場景:

比如說某些去重的場景,如一個使用者只能抽獎一次的這種場景。

有序集合型別

   有序集合型別與集合型別的區別就是有序了,在集合型別的基礎上有序集合型別為集合中的每一個元素都關聯了一個分數,我們既可以使用集合型別的相關操作,還能夠獲得分數最高或者最低的前n個元素。
增加元素:

127.0.0.1:6379> zadd EnglishScore 90 jack 88 tom 99 lczd
(integer) 3

zadd命令用來向有序集合中新增一個元素和該元素的分數。

獲得排名在某個範圍內的元素列表:

127.0.0.1:6379> zrange EnglishScore 0 1
1) "tom"
2) "jack"

   zrange命令會按照元素分數從小到大順序返回指定範圍內的元素,索引都是從0開始,負數代表從後往前查詢。

使用場景:

比如說各種熱門的排序場景,微博前10,播放榜單前100等等。

   Redis還可以實現“釋出/訂閱”模式,訂閱者可以訂閱一個或者若干個平道(channel),釋出者可以向指定的頻道傳送訊息,所有訂閱此頻道的訂閱者都會收到訊息。
如:
publish channel message,這樣訊息就發出去了。訂閱頻道命令 subscribe channel

127.0.0.1:6379> publish channel1.1 hello
(integer) 0
127.0.0.1:6379> subscribe channel1.1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1.1"
3) (integer) 1

執行subscribe命令後客戶端會處於訂閱狀態,此時客戶端無法使用除subscribe 、unsubscribe、pusbscribe、 punsubscribe以外的命令。

   本文列舉了Redis的五種資料型別以及最基本的使用命令,結合各個資料型別的特點,列舉了一些經常使用的場景。想要了解更多的命令可以查詢這個網站:http://redisdoc.c