Redis常用數據結構

1.Redis數據結構概覽

Redis總共包含有五種數據結構:
1.String,單個key,單個value,一個redis字符串中最大有512M。
2. Hash 是一個鍵值對的集合
3. List 是一個鏈表結構
4. Set 是一個無序集合,並且無重複
5. Zset(sort set) 是一個有序集合,無重複

2.String

value是字符串類型

常用的命令包括

set key value:設置key、value
setex key seconds value:設置key、value,有效期seconds秒
setnx key value:設置key、value,如果key存在則setnx失敗,返回 0 (set key value nx等價)
get key:獲取key的值
getset key value:設置key、value,並返回value
mset key value key value:批量設置key、value
mget key key:批量獲取key的值
incr key:key對應的value自增,如果key對應value不是整數返回錯誤,如果key不存在,將value設置爲 1
decr key:key對應的value自減
incrby key increment:key對應的value增加increment
decrby key increment:key對應的value減少increment
incrbyfloat key increment:key對應的浮點數value增加increment(只有incrbyfloat命令,沒有decrbyfloat命令,可以用incrbyfloat一個負數實現decrbyfloat命令)

在服務器上測試

xxx:7001> set abc 10
-> Redirected to slot [7638] located at 10.38.164.94:7004
OK
xxx:7004> get abc
"10"
xxx:7004> incr abc
(integer) 11
xxx:7004> incrby abc 20
(integer) 31
xxx:7004>  object encoding abc
"int"
xxx:7004> set a1 helloworldandredisandjava
OK
xxx:7004>  object encoding a1
"embstr"
xxx:7004> set a2 helloworldandredisandjavaandpythonandscalaandcandshell
-> Redirected to slot [11786] located at 10.38.164.94:7002
OK
10.38.164.94:7002>  object encoding a2
"raw"

String的內部編碼方式

int:8 個字節的長整型
embstr:小於等於 39 個字節的字符串
raw:大於 39 個字節的字符串

其中,incr命令可用於計數,mget、mset命令可以在多條命令時減少網絡層傳輸時間,setnx命令可用於分佈式鎖的一種實現方案,保證只有一個客戶端能請求成功。

3.Hash

即value是Hash的類型,value={f1:v1, f2:v2}這種樣子。
經常使用的命令

HSET key field value 設置hash
HSETNX key field value 將哈希表 key 中的域 field 的值設置爲 value ,當且僅當域 field 不存在。若域 field 已經存在,該操作無效。如果 key 不存在,一個新哈希表被創建並執行 HSETNX 命令。設置成功,返回 1 。如果給定域已經存在且沒有操作被執行,返回 0 。
HMSET key field value [field value ...] 同時將多個 field-value (域-值)對設置到哈希表 key 中
HGET key field 返回哈希表 key 中給定域 field 的值。
HGETALL key 返回哈希表 key 中,所有的域和值
HKEYS key 返回哈希表 key 中的所有域。
HVALS key 返回哈希表 key 中所有域的值。
HLEN key 返回哈希表 key 中域的數量。
HEXISTS key field 給定域 field 是否存在
HDEL key field [field ...] 刪除哈希表 key 中的一個或多個指定域,不存在的域將被忽略。
HINCRBY key field increment 爲哈希表 key 中的域 field 的值加上增量 increment 

在服務器上測試

xx:7004> HSET people name zhangsan
(integer) 1
xx:7004> HSET people age 18
(integer) 1
xx:7004> HSET people sex male
(integer) 1
xx:7004> HGET people name
"zhangsan"
xx:7004> HKEYS people
1) "name"
2) "age"
3) "sex"
xx:7004> HVALS people
1) "zhangsan"
2) "18"
3) "male"
xx:7004> HLEN people
(integer) 3

hash對象底層存儲結構爲ziplist(壓縮列表)和hashtable。當對象滿足一下兩條時,hash對象使用ziplist編碼。
1.hash對象保存的所有kv對的k與v的字符串長度都小於64Byte。
2.hash對象的kv數量小於512個。

由上面的分析,hash類型十分適合對象類數據的存儲,field就是對象的各個屬性,而field的值爲對象屬性的值。

4.List

list 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

List常用的命令包括

LPUSH key value [value ...] 將一個或多個值 value 插入到列表 key 的表頭。
LPUSHX key value 將 value 插入到列表 key 的表頭 當 key 不存在時, LPUSHX 命令什麼也不做
RPUSH key value [value ...] 將一個或多個值 value 插入到列表 key 的表尾(最右邊)。
RPUSHX key value 將值 value 插入到列表 key 的表尾 當 key 不存在時, RPUSHX 命令什麼也不做
LPOP key 移除並返回列表 key 的頭元素。
RPOP key 移除並返回列表 key 的尾元素。
LLEN key 返回列表 key 的長度。
LRANGE key start stop 返回列表 key 中指定區間內的元素,區間以偏移量 start 和 stop 指定。
LINDEX key index 返回列表 key 中,下標爲 index 的元素。
LSET key index value 將列表 key 下標爲 index 的元素的值設置爲 value 。
LINSERT key BEFORE|AFTER pivot value 將值 value 插入到列表 key 當中,位於值 pivot 之前或之後。
LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
BLPOP key [key ...] timeout 它是 LPOP 命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被 BLPOP 命令阻塞,直到等待超時或發現可彈出元素爲止。當給定多個 key 參數時,按參數 key 的先後順序依次檢查各個列表,彈出第一個非空列表的頭元素
BRPOP key [key ...] timeout 與BLPOP類似

list在內部的編碼有兩種方式:ziplist與linkedlist。ziplist使用更加緊湊的結構實現多個元素的連續存儲,在內存方便比linkedlist優秀;linkedlist在讀寫效率方面會比ziplist高。
當元素數量小於512,或者所有元素佔用的字節數都小於64Byte時,會使用ziplist存儲。

list的使用場景:
1.消息隊列,使用lpush + rpop就可以。如果是lpush+brpop可以實現阻塞隊列。
2.棧,使用lpush + lpop就可以。
3. list 結構的數據查詢兩端附近的數據性能非常好,適合一些需要獲取最新數據的場景,比如取最新的新聞,最近的topN等操作。

5.Set

set 是string類型的無序集合,可以方便進行求交集,並集,差集等工作。set中的元素是無序的,所以增加,刪除,查找的炒作都是O(1)時間複雜度。

SADD key member [member ...] 在集合key中插入一個或多個元素。如果key不存在則先創建集合key。
SCARD key 返回集合中的元素個數。
SDIFF key [key ...] 返回多個集合的差集,如果某些集合key不存在認爲是空集
SDIFFSTORE destination key [key ...] 計算多個集合的差集並存儲在 destination 中
SINTER key [key ...] 返回多個集合的交集
SUNION key [key ...] 返回多個集合的並集
SISMEMBER key member 判斷member是否存在於集合key中。
SMEMBERS key 返回集合key的所有元素。如果key不存在認爲是空集。
SREM key member [member ...] 從集合key中移除一個或多個元素。

set 的內部實現是一個 value永遠爲null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因。

使用場景:
1.一個用戶關注的所有人。
2.一個用戶的所有粉絲。
3.兩個用戶的共同關注,共同喜好,二度好友等。

6.Zset

Zset有序集合和Set一樣不能有重複的元素,並且可以對元素進行排序。
在 set 的基礎上給集合中每個元素關聯了一個分數(score),往有序集合中插入數據時會自動根據這個分數排序。

zadd key score member [score member …]:添加成員
zcard key:計算成員數量
zscore key member:計算某個成員的分數
zrank key member:計算成員的排名,從低到高計算
zrevrank key member:計算成員的排名,從高到低計算
zrem key member [member …]:刪除成員
zincrby key increment member:增加成員的分數
zrange key start end [withscores]:從低到高排序取指定元素,如果帶上withscores則同時返回score
zrevrange key start end [withscores]:從高到低排序取指定元素,如果帶上withscores則同時返回score
zrangebyscore key min max [withscores]:從低到高排序顯示分值在min到max之間的成員(包括min和max)
zrevrangebyscore key min max [withscores]:從高到低排序顯示分值在min到max之間的成員(包括min和max)
zcount key min max:統計分值在min到max之間的成員(包括min和max)個數

Zset 內部編碼有兩種方式 1.ziplist 2.skiplist
當元素數量小於128,每個元素都小於64Byte時,使用ziplist存儲可以節約內存。

使用場景:
1.排行榜。排行榜一般都是唯一id,並且需要進行排序。
2.帶權重的消息隊列

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章