首页 > 代码库 > 五、Redis 基础命令---无序集合

五、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 基础命令---无序集合