五、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 隨機從集合中彈出一個元素

     










     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章