redis數據結構之無序集合(set)、有序集合(zset)、基數(HyperLogLog)


一、redis數據結構之無序集合(set)

redis的集合不是一個線性結構,而是一個哈希表結構,它的內部會根據哈希分子來存儲和查找數據,理論上一個集合可以存儲2的32次方-1(大約42億)個元素,因為采用哈希表結構,所以對於redis集合的插入、刪除和查找的復雜度都是O(1)。在redis中集合可以對於不同的集合進行操作,如求兩個或兩個以上集合的差集和交集、並集等操作。
此外需要注意如下三點:
1、集合是無序的;
2、集合中元素是不重復的即唯一的,插入重復的元素會失敗;
3、集合中每一個元素都是String數據結構類型。
集合命令如下表所示:

命令 說明 備注
sadd key member1[member2...] 給鍵為key的集合增加元素 可以同時增加多個元素
scard key 統計鍵為key的集合成員數
sdiff key1 [key2] 找出兩個集合的差集 如果為單個集合,則返回該集合的所有元素
sdiffstore des key1 [key2] 先對兩個集合求差集,然后將所求結果保存到集合des中
sinter key1 [key2] 求key1和key2兩個集合的交集 如果為單個集合,則返回該集合的所有元素
sinterstore des key1 [key2] 先對兩個集合求交集,然后將所求結果保存到集合des中
sismember key member 判斷member是否是鍵為key的集合元素 如果是返回1,否則返回0
smembers key 返回集合中的所有元素 如果數據量很大,需要考慮迭代遍歷的問題
smove src des member 將成員member從集合src移動到集合des中
spop key 隨機彈出集合中的一個元素 需要注意其隨機性,因為集合是無序的
srandmember key [count] 隨機返回集合中一個或多個元素,count為返回元素的限制,如果為負數,則先求其絕對值 count為整數,如果不填默認為1,如果大於集合元素總數,則返回全部元素
sunion key1[key2] 求兩個集合的並集 如果為單個集合,則返回該集合的所有元素
sunionstore des key1 key2 先對兩個集合求並集,然后將所求結果保存到集合des中

示例如下所示:

二、redis數據結構之有序集合(zset)

有序集合和集合類似,而zset只是說明他是有序的,和無序集合的主要區別在於每一個元素除了值之外,還多了一個分數。這個分數是浮點數,在java中是用雙精度來表示的,redis根據這個分數就可以對分數進行從小到大或從大到小的排序。在有序集合中元素都是唯一的,但是對於不同元素而言,它的分數可以一樣。有序集合也是通過哈希結構實現的,因此添加、刪除,查找的復雜度也是O(1)。
有序集合依賴key表示它是屬於哪個集合,而依賴分數進行排序,因此值和分數都是必須的。實際上不僅可以對分數進行排序,在滿足一定條件下也可以對值進行排序。
有序集合命令如下表所示:

命令 說明 備注
zadd key score1 value1[score2 value2] ... 向有序集合key增加一個或多個元素 如果沒有存在的集合key則新建一個鍵為key的集合
zcard key 獲取有序集合的元素個數
zcount key min max 根據分數返回指定的成員列表 min為最小值,max為最大值,默認包含min和max,采用數學區間表示,如果需要不包含,則在分數前面加上(,但是不支持[
zincrby key increment member 給有序集合成員值為member的分數增加increment
zinterstore desKey numkeys key1[key2 key3]... 求多個有序集合的交集,並將結果保存到desKey中 numKeys是一個整數,表示有多少個有序集合
zlexcount key min max 求有序集合key成員值在min和max的范圍 這里的范圍為key的成員值,redis借助數據區間的表示方法,[表示包含,(表示不包含
zrange key start stop [withscores] 按照分值的大小返回指定范圍內的成員,如果輸入可選withscores,則連同分數一起返回
zrank key member 按從小到大求有序集合的排行 排名第一的為0,第二為1,以此類推...
zrangebylex key min max [limit offset count] 根據值的大小從小到大排序,min為最小值,max為最大值,limit為可選,當redis求出范圍集合后,會產生下標0到n,然后根據偏移量offset和限定返回數count,返回對應的成員
zrangebyscore key min max [withscores] [limit offset count ] 根據分數的大小從小到大排序,min為最小值,max為最大值,limit為可選,當redis求出范圍集合后,會產生下標0到n,然后根據偏移量offset和限定返回數count,返回對應的成員
zremrangebyscore key start stop 根據分數區間進行刪除
zremrangebyrank key start stop 按照分數排行從小到大的排序刪除,從0開始計算
zremrangebylex key min max 按照值的分布進行刪除
zrevrange key start stop [withscores] 從大到小按分數進行排序 與zrange相同,只是排序從大到小
zrevrangebyscore key max min [withscores] 從大到小按分數排序 與zrangebyscore相同,只是排序從大到小
zrevrank key member 按照從大到小的順序,求元素的排序 排名第一為0,第二為1,以此類推
zscore key member 返回成員的分數值 返回成員的分數
zunionstore desKey numKeys key1[key2 key3 ...] 求多個有序集合的並集,並將結果存儲到deskey中,numKeys表示有多少個有序集合

三、redis數據結構之基數(HyperLogLog)

基數是一種算法,基數的作用是評估大約需要多少個存儲單元去存儲數據,但是基數的算法一般會存在誤差(可控的誤差)。基數並不存儲元素,存儲元素對內存空間的消耗比較大,而是給某一個有重復數據的集合評估需要的空間單元數,所以基數是不存儲元素的。
簡要了解基數的常用命令即可,如下表所示:

命令 說明 備注
pfadd key element 添加指定元素到基數中 如果已經存在則返回為0,添加失敗
pfcount key 返回HyperLogLog的基數值
pfmerge desKey key1[key2....] 合並多個基數,並將其結果保存到desKey中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM