Redis(六)—— Set 集合类型详解

本文介绍了Redis中Set数据类型的特点和实现方式,包括其无序性、唯一性和高效操作。通过实例展示了`sadd`、`smembers`、`sismember`、`scard`、`srem`、`spop`、`srandmember`、`smove`等命令的用法,以及集合的交集、并集和差集操作。这些操作在复杂度上均为O(1),适合大量数据的快速处理。

Set(集合)

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

集合对象的编码可以是 intset 或者 hashtable。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

使用实例

设置集合的值:sadd

#================================================================
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset hello #重复添加则失败
(integer) 0


查看集合的所有值:smembers,为1存在,为0不存在

#================================================================
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"

判断某个值是否在集合中:sismember,为1存在,为0不存在

#================================================================
127.0.0.1:6379> sismember myset hello
(integer) 1  #存在
127.0.0.1:6379> sismember myset hi
(integer) 0  #不存在

查看集合中值的个数:scard

#================================================================
127.0.0.1:6379> scard myset
(integer) 2

移除集合中的指定值:srem

#================================================================
127.0.0.1:6379> smembers myset
1) "hi"
2) "world"
3) "hello"
127.0.0.1:6379> srem myset hi
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"

随机移除集合中的值:spop

#================================================================
127.0.0.1:6379> smembers myset  #查看集合中所有值
1) "wan"
2) "world"
3) "hello"
4) "li"
127.0.0.1:6379> spop myset 1  #随机移除myset集合中的一个值
1) "wan"
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "li"
127.0.0.1:6379> spop myset 2  #随机移除myset集合中的两个值
1) "world"
2) "li"
127.0.0.1:6379> smembers myset  #myset集合中值的剩余情况
1) "hello"

从集合中随机抽取元素,但不移除:srandmember

#================================================================
127.0.0.1:6379> sadd myset hello1
(integer) 1
127.0.0.1:6379> sadd myset hello2
(integer) 1
127.0.0.1:6379> sadd myset hello3
(integer) 1
127.0.0.1:6379> sadd myset hello4
(integer) 1
127.0.0.1:6379> sadd myset hello5
(integer) 1
127.0.0.1:6379> sadd myset hello6
(integer) 1
127.0.0.1:6379> sadd myset hello7
(integer) 1
127.0.0.1:6379> sadd myset hello8
(integer) 1
127.0.0.1:6379> sadd myset hello9
(integer) 1
127.0.0.1:6379> smembers myset
1) "hello7"
2) "hello5"
3) "hello3"
4) "hello4"
5) "hello6"
6) "hello1"
7) "hello8"
8) "hello2"
9) "hello9"
127.0.0.1:6379> srandmember myset  #从myset集合中随机抽取一个元素
"hello6"
127.0.0.1:6379> srandmember myset
"hello3"
127.0.0.1:6379> srandmember myset
"hello9"
127.0.0.1:6379> srandmember myset
"hello3"
127.0.0.1:6379> srandmember myset 2  #从myset集合中随机抽取两个元素
1) "hello7"
2) "hello8"
127.0.0.1:6379> srandmember myset 2
1) "hello5"
2) "hello2"
127.0.0.1:6379> srandmember myset 2
1) "hello6"
2) "hello9"
127.0.0.1:6379> srandmember myset 2
1) "hello3"
2) "hello8"

移动一个集合中的指定元素到另一个集合中:smove

#================================================================
127.0.0.1:6379> sadd myset1 hello1
(integer) 1
127.0.0.1:6379> sadd myset2 hello2
(integer) 1
127.0.0.1:6379> smove myset1 myset2 hello1 #移动myset1集合中的hello1元素到myset2集合中
(integer) 1
127.0.0.1:6379> smembers myset2
1) "hello1"
2) "hello2"
127.0.0.1:6379> smembers myset1
(empty array)

两个集合的差集(sdiff)和并集(sunion)和交集(sinter)

#================================================================
127.0.0.1:6379> sadd set1 a
(integer) 1
127.0.0.1:6379> sadd set1 b
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1
127.0.0.1:6379> sadd set2 c
(integer) 1
127.0.0.1:6379> sadd set2 d
(integer) 1
127.0.0.1:6379> sadd set2 e
(integer) 1
#==============================差集==================================
#集合set1中独有的元素
127.0.0.1:6379> sdiff set1 set2
1) "b"
2) "a"
#集合set2中独有的元素
127.0.0.1:6379> sdiff set2 set1
1) "e"
2) "d"
#==============================两个集合的并集==================================
127.0.0.1:6379> sunion set1 set2
1) "a"
2) "c"
3) "b"
4) "e"
5) "d"
127.0.0.1:6379> sunion set2 set1
1) "d"
2) "c"
3) "e"
4) "b"
5) "a"
#==============================两个集合的交集==================================
127.0.0.1:6379> sinter set1 set2
1) "c"

更多命令请参考:https://redis.io/commands

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里顾—程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值