一、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中 |