集合(set)类型也是用于保存多个的字符串元素,但也列表不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素
redis除了支持集合内的增删改查,同时还支持多个集合取交集,并集,差集
集合内操作
添加元素
sadd key element [element ...]
返回结果为添加成功的元素个数
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> sadd myset a b
(integer) 0
删除元素
srem key element [element ...]
返回结果为成功删除元素个数
127.0.0.1:6379> srem myset a b
(integer) 2
127.0.0.1:6379> srem myset hello
(integer) 0
计算元素个数
scard key
127.0.0.1:6379> scard myset
(integer) 1
判断元素是否在集合中
sismember key element
如果元素存在返回1,不存在返回0
127.0.0.1:6379> sismember myset c
(integer) 1
127.0.0.1:6379> sismember myset d
(integer) 0
随机从集合中返回指定个数元素
srandmember key [count]
[count]默认为1
127.0.0.1:6379> sadd myset a b c d e f g
(integer) 6
127.0.0.1:6379> srandmember myset 2
1) "d"
2) "e"
127.0.0.1:6379> srandmember myset
"f"
从集合随机弹出元素
spop key
从集合中随机弹出一个元素
127.0.0.1:6379> spop myset
"b"
127.0.0.1:6379> spop myset
"g"
srandmember和spop都是随机从集合选出元素,不同之处在于,spop会将元素从集合中弹出
获取所有元素
smembers key
返回的结果是无序的
127.0.0.1:6379> smembers myset
1) "d"
2) "c"
3) "e"
4) "a"
5) "f"
smembers和lrange, hgetall都属于比较重的命令,如果元素过多,有可能阻塞
集合间操作
创建两个集合
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 ent sports
(integer) 4
求集合间交集
sinter key [key ...]
127.0.0.1:6379> sinter user:1:follow user:2:follow
1) "it"
2) "sports"
求多个集合的并集
suinon key [key ...]
127.0.0.1:6379> sunion user:1:follow user:2:follow
1) "ent"
2) "his"
3) "it"
4) "sports"
5) "news"
6) "music"
求多个集合的差集
sdiff key [key ...]
127.0.0.1:6379> sdiff user:1:follow user:2:follow
1) "his"
2) "music"
保存集合运算的结果
集合的运算过程是比较耗时的,如果需要重复用到运算结果,就很有必要将结果存储起来。以下命令将集合间的交集、并集、差集结果保存到另一个集合中
sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]
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) "it"
2) "sports"
127.0.0.1:6379> sunionstore user:1_2:union user:1:follow user:2:follow
(integer) 6
127.0.0.1:6379> smembers user:1_2:union
1) "ent"
2) "his"
3) "it"
4) "sports"
5) "news"
6) "music"
127.0.0.1:6379> sdiffstore user:1_2:diff user:1:follow user:2:follow
(integer) 2
127.0.0.1:6379> smembers user:1_2:diff
1) "his"
2) "music"
时间复杂度
集合类型命令时间复杂度应用场景
集合类型的典型应用场景是标签。如文章标签:一篇文章可以有多个标签,每个标签都不相同,不同文章的标签可相同,也可不同。文章之间可能标签可以进行归类筛选
同理,社交或电商网站给用户添加标签(兴趣、爱好等),也是集合的经典应用场景
网友评论