集合(set)也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合可以存储2^32 - 1
个元素。
Redis除了支持集合内的增删查改,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。
1)添加元素
sadd key element [element ...]
返回结果为添加成功的元素个数,如:
127.0.0.1:6379> exists myset
(integer) 0
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> sadd myset a b
(integer) 0
2)删除元素
srem key element [element ...]
返回结果为成功删除元素个数,如:
127.0.0.1:6379> srem myset a b
(integer) 2
127.0.0.1:6379> srem myset hi
(integer) 0
3)计算元素个数
scard key
scard的时间复杂度为O(1),它不会遍历集合所有元素,而是直接用Redis内部的变量,如:
127.0.0.1:6379> scard myset
(integer) 1
4)判断元素是否在集合中
sismember key element
如果给定元素element在集合内返回1,反之返回0,如:
127.0.0.1:6379> sismember myset c
(integer) 1
127.0.0.1:6379> sismember myset d
(integer) 0
5)随机从集合中返回指定个数元素
srandmember key [count]
[count]是可选参数,如果不选默认为1,如:
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> srandmember myset 2
1) "b"
2) "c"
127.0.0.1:6379> srandmember myset
"a"
6)从集合随机弹出元素
spop key
如:
127.0.0.1:6379> spop myset
"b"
127.0.0.1:6379> smembers myset
1) "a"
2) "c"
需要注意的是Redis从3.2版本开始,spop也支持[count]参数。
srandmember和spop都是随机从集合选出元素,两者不同的是spop命令执行后,元素会从集合中删除,而srandmember不会。
7)获取所有元素
smembers key
下面代码获取集合myset所有元素,并且返回结果是无序的:
127.0.0.1:6379> smembers myset
1) "a"
2) "c"
现在有两个集合,它们分别是user:1:follow和user:2:follow:
127.0.0.1:6379> sadd user:1:follow it music his sports
(integer) 4
127.0.0.1:6379> sadd user:2:follow it news end sports
(integer) 4
1)求多个集合的交集
sinter key [key ...]
如:
127.0.0.1:6379> sinter user:1:follow user:2:follow
1) "sports"
2) "it"
2)求多个集合的并集
sunion key [key ...]
如:
127.0.0.1:6379> sunion user:1:follow user:2:follow
1) "end"
2) "sports"
3) "his"
4) "music"
5) "news"
6) "it"
3)求多个集合的差集
sdiff key [key ...]
如:
127.0.0.1:6379> sdiff user:1:follow user:2:follow
1) "music"
2) "his"
4)将交集、并集、差集的结果保存
sinterstore destination key [key ...]
sunionstore destination key [key ...]
sdiffstore destination key [key ...]
集合间的运算在元素较多的情况会比较耗时,所以Redis提供了上面三个命令(原命令+store)将集合间交集、并集、差集的结果保存在destination中,例如下面操作将user:1:follow和user:2:follow两个集合的交集结果保存在user:1_2:inter中,user:1_2:inter本身也是集合类型:
127.0.0.1:6379> sinterstore user:1_2:inter user:1:follow user:2:follow
(integer) 2
127.0.0.1:6379> type user:1_2:inter
set
127.0.0.1:6379> smembers user:1_2:inter
1) "sports"
2) "it"
命令 | 时间复杂度 |
---|---|
sadd key element [element …] | O(k),k是元素个数 |
srem key element [element …] | O(k),k是元素个数 |
scard key | O(1) |
sismember key element | O(1) |
srandmember key [count] | O(count) |
spop key | O(1) |
smembers key | O(n),n是元素总数 |
sinter key [key …] 或 sinterstore | O(m*k),k是多个集合中元素最少的个数,m是键个数 |
sunion key [key …] 或 sunionstore | O(k),k是多个集合元素个数和 |
sdiff key [key …] 或 sdiffstore | O(k),k是多个集合元素个数和 |
《Redis开发与运维》 付磊 & 张益军