標籤:redis 設計實現
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
1) "1"
2) "2"
3) "3"
4) "4"
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
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 隨機從集合中彈出一個元素
五、Redis 基礎命令---無序集合