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 随机从集合中弹出一个元素