点击
蓝色
字体催更

一、set 介绍

Redis集合是一个无序的字符串合集。
首先集合是一个字符串合集,和列表list 一样,用来存储一组字符串的。
其次集合是无序的,区别于 list 来说,
集合的存储是无序的,所以无法通过下标值的方式从集合中获取元素。
集合不仅无序,且不允许元素重复,也就是说往集合中加入两个相同的元素,集合中只会存储一个。
集合支持集合运算,比如说:求交集并集等。
更多关于集合的介绍可以自行查阅 Redis 官方文档或者命令参考文档。
二、set 简单操作
下面进行关于集合的一些简单操作。
现在准备两组集合数据,用于测试:
第一组集合:1,3,5,7
第二组集合:1,5,6,9
2.1、sadd 命令设置两组数据
相关操作指令如下:
## 设置第一组集合sadd set1 1 3 5 7## 设置第二组集合sadd set1 1 5 6 9
可以通过,SINTER 或者 SUNION 求自身的交集或者并集的方式查看集合数据
## 通过求自身交集的方式,查看 set1 集合数据127.0.0.1:6379> SINTER set11) "1"2) "3"3) "5"4) "7"## 通过自身并集的方式,查看 set2 集合数据127.0.0.1:6379> SUNION set21) "1"2) "5"3) "6"4) "9"
通过 set1 来验证集合元素的唯一性,也就是元素不能重复的特性,往 set1
中再追加一个 1,
通过两种方式可以知道设置是否成功
1、通过sadd 的返回值,0 失败 , 非零 表示成功
2、通过查看 set1 的集合数据验证元素的唯一性
2.2、SINTER 求交集
在上面 set1 = 1 3 5 7
,set2 = 1 5 6 9
,求 set1
和 set2
的交集。如下图:

set1 ∩ set2
和 set2 ∩ set1
结果相同,都是 1,5
。
相关操作指令如下:
## set1 ∩ set2127.0.0.1:6379> SINTER set1 set21) "1"2) "5"## set2 ∩ set1127.0.0.1:6379> SINTER set2 set11) "1"2) "5"
2.3、SUNION 求并集
在上面 set1 = 1 3 5 7
,set2 = 1 5 6 9
,求 set1
和 set2
的并集。如下图:

set1 ∪ set2
和 set2 ∪ set1
结果相同,都是,1,3,5,6,7,9 。
相关操作指令如下:
## set1 ∪ set2127.0.0.1:6379> SUNION set1 set21) "1"2) "3"3) "5"4) "6"5) "7"6) "9"## set2 ∪ set1127.0.0.1:6379> SUNION set2 set11) "1"2) "3"3) "5"4) "6"5) "7"6) "9"
2.4、SDIFF 求差集
在上面 set1 = 1 3 5 7
,set2 = 1 5 6 9
,求 set1
和 set2
的差集。如下图:


set1 - set2
和 set2 -set1
结果是不相同的。
set1 - set2 = 3 7
set2 - set1 = 6 9
相关指令如下:
## set1 - set2127.0.0.1:6379> SDIFF set1 set21) "3"2) "7"## set2 - set1127.0.0.1:6379> SDIFF set2 set11) "6"2) "9"
2.5、其他
集合的计算不仅仅能够支持两个集合的运算,还支持多个集合的运算同时运算,除此之外,还有一些其他的操作命令,比如随机的弹出一个集合中的元素, spop 指令,可以自行参考文档进行测试。
三、编码结构
接下来来简单看看集合内部编码的结构定义,针对集合 set 存在两种编码格式
hashtable
intset
关于 hashtable 在 hash 结构 时有提到过,这里不在进行赘述。
下面简单聊一聊 intset 的编码格式
来看一张 intset 的编码格式逻辑图,如下图:

根据图片来看一下 intset 编码格式,在 Redis 中代码定义。
相关编码结构在 intset.h 文件中,如下图:

intset 编码格式包含了三个字段
encoding:intset 类型,三种:int-16、int-32、int-64
length : 集合元素格式,最大为 2^32-1
contents[]:集合元素存储数组
【回复:Redis资料包】
获取相关 Redis 资料,资料实时更新....
end




