Redis学习笔记【07】 - 集合

一、简介

集合(set)也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合可以存储2^32 - 1个元素。

Redis学习笔记【07】 - 集合_第1张图片

Redis除了支持集合内的增删查改,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。

二、命令

1、集合内操作

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"

2、集合间操作

现在有两个集合,它们分别是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开发与运维》 付磊 & 张益军

你可能感兴趣的:(Redis,redis)