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

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

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

命令 說明 備註
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

2、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表示有多少個有序集合  

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

基數是一種算法,基數的做用是評估大約須要多少個存儲單元去存儲數據,可是基數的算法通常會存在偏差(可控的偏差)。基數並不存儲元素,存儲元素對內存空間的消耗比較大,而是給某一個有重複數據的集合評估須要的空間單元數,因此基數是不存儲元素的。
簡要了解基數的經常使用命令便可,以下表所示:數據結構

命令 說明 備註
pfadd key element 添加指定元素到基數中 若是已經存在則返回爲0,添加失敗
pfcount key 返回HyperLogLog的基數值  
pfmerge desKey key1[key2....] 合併多個基數,並將其結果保存到desKey中
相關文章
相關標籤/搜索