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
有序集合和集合相似,而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表示有多少個有序集合 |
基數是一種算法,基數的做用是評估大約須要多少個存儲單元去存儲數據,可是基數的算法通常會存在偏差(可控的偏差)。基數並不存儲元素,存儲元素對內存空間的消耗比較大,而是給某一個有重複數據的集合評估須要的空間單元數,因此基數是不存儲元素的。
簡要了解基數的經常使用命令便可,以下表所示:數據結構
命令 | 說明 | 備註 |
---|---|---|
pfadd key element | 添加指定元素到基數中 | 若是已經存在則返回爲0,添加失敗 |
pfcount key | 返回HyperLogLog的基數值 | |
pfmerge desKey key1[key2....] | 合併多個基數,並將其結果保存到desKey中 |