集合
Redis的集合中的元素不允许重复,并且没有顺序,一个集合类型的键可容纳2^32-1个字符串。
集合和列表的区别如下所示:
集合类型 | 列表类型 | |
---|---|---|
存储大小 | <2^32-1 | <2^32-1个 |
有序性 | 否 | 是 |
唯一性 | 是 | 否 |
SADD key [member…]
SADD命令用来向集合中添加一个或多个元素,如果键不存在则会自动创建,因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素,返回值是成功加入元素的个数,示例如下:
127.0.0.1:6379> SADD sunshine java python shell
(integer) 3
127.0.0.1:6379> SADD sunshine java php
(integer) 1
SREM key [member…]用来从集合中删除一个或多个元素,返回值是删除成功的元素个数,示例如下:
127.0.0.1:6379> SREM sunshine php shell
(integer) 2
127.0.0.1:6379> SREM sunshine php python
(integer) 1
SMEMBERS key
SMEMBERS key用于获得集合中所有的元素,示例如下:
127.0.0.1:6379> SMEMBERS sunshine
1) "shell"
2) "java"
3) "python"
SISMEMBER key member
SISMEMBER key member用于判断一个元素是否在集合中,时间复杂度是O(1),若存在则返回1,不存在返回0,示例如下:
127.0.0.1:6379> SISMEMBER sunshine java
(integer) 1
127.0.0.1:6379> SISMEMBER sunshine fool
(integer) 0
集合运算
SDIFF、SINTER和SUNION三个命令都是用来进行多个集合间的运算的。
SDIFF命令用来对多个集合进行差集运算,代表所有属于A但不属于B的元素构成的集合,该命令的使用方法如下:
127.0.0.1:6379> SADD A 1 2 3
(integer) 3
127.0.0.1:6379> SADD B 3 4 5
(integer) 3
127.0.0.1:6379> SDIFF A B
1) "1"
2) "2"
127.0.0.1:6379> SDIFF B A
1) "4"
2) "5"
SDIFF命令支持同时传入多个键,例如:
127.0.0.1:6379> SADD C 1 3 5
(integer) 3
127.0.0.1:6379> SDIFF A B C
1) "2"
计算顺序是先计算A和B的差集,再计算前面的结果与C的差集。
SINTER命令用来对多个集合执行交集运算,代表所有属于A且属于B的元素构成的集合,SINTER命令示例如下:
127.0.0.1:6379> SINTER A B C
1) "3"
SUNION命令用来对多个集合执行并集运算,代表所有属于A或所有属于B的元素构成的集合,SUNION命令示例如下:
127.0.0.1:6379> SUNION A B C
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
SMEMBERS命令用来查看集合中所有的元素,那么SCARD命令用来获得集合中所有元素的个数,SCARD命令示例如下:
127.0.0.1:6379> SCARD A
(integer) 3
SDIFF、SINTER和SUNION命令用来求交并集,但是得出是结果,怎样才能将计算结果声明到一个新的键中呢?
这里有三个拓展命令:SDIFFSTORE、SINTERSTORE和SUNIONSTORE。命令示例如下:
127.0.0.1:6379> SDIFFSTORE diffset A B C
(integer) 1
127.0.0.1:6379> SINTERSTORE interset A B C
(integer) 1
127.0.0.1:6379> SUNIONSTORE unionset A B C
(integer) 5
命令的区别在于,一个是返回直接结果,另一个是将结果返回到一个声明的键中。
SRANDMEMBER key [count]命令用来随机从集合中获取一个或多个元素,数量由[count]数值决定,SRANDMEMBER示例如下:
127.0.0.1:6379> SRANDMEMBER unionset 1
1) "3"
127.0.0.1:6379> SRANDMEMBER unionset 3
1) "2"
2) "5"
3) "4"
这里,[count]值不同,具体表现形式如下:
- 当count为正数时,SRANDMEMBER会随机从集合中获得count个不重复的元素,如果count的值大于集合中元素总数,SRANDMEMBER会返回集合中的全部元素。
- 当count为负数时,SRANDMEMBER会随机从集合里获得|count|个数的元素,这些元素有可能相同。
经验证,count应该为非零整数,当count=0时,结果如下所示:
127.0.0.1:6379> SRANDMEMBER unionset 0
(empty list or set)
SPOP key,前面讲的LPOP命令是从列表左边弹出一个元素(返回元素的值并删除),SPOP命令与其类似,但由于集合类型的元素是无序的,所以该命令会随机从集合中弹出一个元素,SPOP命令示例如下:
127.0.0.1:6379> SPOP unionset
"4"
127.0.0.1:6379> SPOP unionset
"3"
127.0.0.1:6379> SPOP unionset
"1"