集合(set)类型也是用来保存多个字符串成员,但和列表类型不一样的是,集合中不允许有重复成员,并且集合中的成员是无序的,不能通过索引下标获取成员,一个集合最多可以存储2的32次方减1个成员。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。
1. 集合内操作
(1) 添加成员
sadd key member [member ...]
返回结果为添加成功的成员个数,例如:
192.168.211.131:7001> sadd set:1 1 2 3 4
(integer) 4
(2) 删除成员
srem key member [member ...]
返回结果为删除成员个数,例如:
192.168.211.131:7004> srem set:1 4
(integer) 1
(3) 计算成员个数
scard key
scard的时间复杂度为O(1),它不会遍历集合所有成员,而是直接用redis内部的变量,例如:
192.168.211.131:7004> scard set:1
(integer) 3
(4) 判断成员是否在集合中
sismember key member
如果给定成员在集合内返回1,反之返回0,例如
192.168.211.131:7004> sismember set:1 2
(integer) 1
192.168.211.131:7004> sismember set:1 4
(integer) 0
(5) 随机从集合返回指定个数成员
192.168.211.131:7004> srandmember set:1
"3"
192.168.211.131:7002> srandmember set:1 2
1) "1"
2) "2"
(6) 从集合随机弹出成员
spop key [count]
spop操作可以从集合中随机弹出成员,个数由count指定,例如下面代码是一次spop后,集合成员变为0、1、3、4、6、7、8:
192.168.211.131:7004> spop set:1 3
1) "9"
2) "5"
3) "2"
192.168.211.131:7004> smembers set:1
1) "0"
2) "1"
3) "3"
4) "4"
5) "6"
6) "7"
7) "8"
(7) 获取所有成员
smembers key
下面代码获取集合set:1所有成员,并且返回结果是无序的:
192.168.211.131:7004> smembers set:1
1) "0"
2) "1"
3) "3"
4) "4"
5) "6"
6) "7"
7) "8"
2. 集合间操作
现在有2个集合set:1和set:2,
set:1:0 1 3 4 6 7 8
set:2:0 1 3 5 7
(1) 求多个集合的交集
sinter key [key ...]
下面是求set:1和set:2两个集合的交集:
192.168.211.131:6379> sinter set:1 set:2
1) "0"
2) "1"
3) "3"
4) "7"
(2) 求多个集合的并集
sunion key [key ...]
下面是求set:1和set:2两个集合的并集:
192.168.211.131:6379> sunion set:1 set:2
1) "0"
2) "1"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
(3) 求多个集合的差集
sdiff key [key ...]
下面是求set:1和set:2两个集合的差集:
192.168.211.131:6379> sdiff set:1 set:2
1) "4"
2) "6"
3) "8"
(4) 将交集、并集、差集的结果保存
sinterstore destination key [key ...]
sunionstore destination key [key ...]
sdiffstore destination key [key ...]
集合间的运算在成员较多的情况下会比较耗时,索引redis提供了上面三个命令(原命令+store)将集合间交集、并集、差集的结果保存在destination key中,例如下面操作将set:1和set:2两个集合的交集保存在set:1_2:inter中,set:1_2:inter本身也是集合类型:
192.168.211.131:6379> sinterstore set:1_2:inter >set:1 set:2
(integer) 4
192.168.211.131:6379> smembers set:1_2:inter
1) "0"
2) "1"
3) "3"
4) "7"