暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【018】-Redis-数据结构-Set介绍

花好夜猿 2020-10-02
179

点击

蓝色

字体催更



 一、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 set1
1) "1"
2) "3"
3) "5"
4) "7"


## 通过自身并集的方式,查看 set2 集合数据
127.0.0.1:6379> SUNION set2
1) "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 ∩ set2
127.0.0.1:6379> SINTER set1 set2
1) "1"
2) "5"


## set2 ∩ set1
127.0.0.1:6379> SINTER set2 set1
1) "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 ∪ set2 
127.0.0.1:6379> SUNION set1 set2
1) "1"
2) "3"
3) "5"
4) "6"
5) "7"
6) "9"


## set2 ∪ set1
127.0.0.1:6379> SUNION set2 set1
1) "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 - set2 
127.0.0.1:6379> SDIFF set1 set2
1) "3"
2) "7"


## set2 - set1
127.0.0.1:6379> SDIFF set2 set1
1) "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


2:表示 quicklist 两端各有2个 quicklist node 节点不压缩,中间的其他 quicklist 节点进行压缩


文章转载自花好夜猿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论