1、集合中的每個元素都是唯一的,沒有順序的。
2、集合與列表的對比
集合 | 列表 | |
存儲內容 | 最多 2^32-1個字符串 | 最多 2^32-1個字符串 |
有序性 | 無序 | 有序 |
唯一性 | 唯一 | 不唯一 |
3、集合內部使用的是值爲空的散列表實現,所以向集合中插入、刪除、判斷元素是否存在操作的時間複雜度都是O(1)
4、SADD key member1 member2...添加元素,可以同時添加多個
127.0.0.1:6379> SADD setA 1 2 3 4(integer) 4
5、SMEMBERS key 獲取所有數據
127.0.0.1:6379> SMEMBERS setA
4) "4"1) "1"2) "2"3) "3"
6、SREM key value1 value2 刪除數據 ,返回刪除的個數
127.0.0.1:6379> SMEMBERS setA
1) "1"2) "2"3) "3"4) "4"
127.0.0.1:6379> SREM setA 1 2(integer) 2
7、SISMEMBER key member 判斷是否存在,返回1表示存在,返回0表示不存在
127.0.0.1:6379> SMEMBERS setA
1) "3"2) "4"
127.0.0.1:6379> SISMEMBER setA 3
(integer) 1
127.0.0.1:6379> SISMEMBER setA 4
(integer) 1
127.0.0.1:6379> SISMEMBER setA 5
(integer) 0
(integer) 0
8、集合間運算
SDIFF key1 key2 key3... 差集
SINTER key1 key2 key3 ......交集
SUNION key1 key2 key3......並集
9、SRANDMEMBER 隨機獲取一個元素
SRANDMEMBER set count
如果count值爲正數時,會從集合中隨機獲取 count 個不重複的元素,如果count值大於集合size ,則返回所有元素
如果count值爲負數時,從集合中隨機獲取 |count|個元素, 這些元素有可能相同
原理:
SRANDMEMBER 返回的元素並不是非常的隨機,出現這種情況是由集合類型採用的存儲結構(散列表即hash)造成的。
散列表採用散列函數將元素映射到不同的存儲桶(bucket)上以實現O(1)的時間複雜度的元素查找。舉個例子,當散列表存儲元素B時,計算b的散列值是0,就會把元素B存儲到0號bucket上。下次get元素時,使用同樣的算法計算出b的散列值是0,直接去0號bucket上讀取元素。如果遇到了元素衝突,即多個元素的散列值相同,集合採用拉鍊法解決衝突,將散列值衝突的元素以鏈表的形式存入同一個桶中,查找元素時先找到對應元素的桶,然後再在鏈表中找到相應的元素。
SANDMEMBER 命令是隨機獲取一個bucket,然後再在對應的鏈表中隨機獲取一個元素。所以元素所在的桶中元素越少,被隨機選中的可能性越大。
其實HashMap的原理也同上。如圖:
10、SPOP 隨機從集合中彈出一個元素