Redis学习笔记【07】 - 集合

本文介绍了Redis中的集合类型,特点包括不允许重复元素和无序性。详细阐述了集合的命令,如添加、删除元素,计算元素个数,判断元素是否存在,以及交集、并集、差集等集合间操作。还提到了相关命令的时间复杂度,如scard为O(1)。最后,讨论了如何将集合运算结果保存到新的集合中,以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

集合(set)也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合可以存储2^32 - 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 keyO(1)
sismember key elementO(1)
srandmember key [count]O(count)
spop keyO(1)
smembers keyO(n),n是元素总数
sinter key [key …] 或 sinterstoreO(m*k),k是多个集合中元素最少的个数,m是键个数
sunion key [key …] 或 sunionstoreO(k),k是多个集合元素个数和
sdiff key [key …] 或 sdiffstoreO(k),k是多个集合元素个数和

参考:

《Redis开发与运维》 付磊 & 张益军

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值