【Redis 系列】常用数据结构---SET类型

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

SET(集合)类型

和List类型相似的是集合类型也是保存多个字符串类型 元素的,不同的是:

  • set类型元素之间是无序的
  • 元素也不允许重复
  • Redis除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集

注意:在Redis中,绝大多数集合类型(List、Set、Hash、ZSet)的理论最大元素容量为 2³²-1(约43亿)。这一限制源于Redis最初的设计架构和对32位系统的兼容性考虑 ,一般情况下不会出现这个情况,元素数量越大,要求内存越大,并且由于redis单线程的架构,大集合操作会导致阻塞

普通命令

SADD

作用:将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添加到set中

powershell 复制代码
# 语法
SADD key member [member]

返回值:本次添加成功的元素个数

SMEMBERS

作用:获取一个set中的所有元素,并且元素间的顺序是⽆序的。

powershell 复制代码
smembers key

返回值:所有元素的列表

SISMEMBER

作用:判断一个元素在不在集合中

powershell 复制代码
sismember key member

返回值:1表示元素在set中;0表示元素不在set中或者key不存在

SCARD

作用:获取一个set中的的元素个数

powershell 复制代码
scard key


返回值:set内的元素个数

SPOP

作用:从set中删除并返回一个或者多个元素,由于set内的元素是⽆序的,所以取出哪个元素实际是未定义,即可以看作随机的

powershell 复制代码
spop key [count]

时间复杂度:O(N),N是count
返回值:取出的元素

SMOVE

作用:将一个元素从源set取出并放入目标set中

powershell 复制代码
smove source destination member

返回值:1表示移动成功;0表示失败

SREM

作用:将指定元素从set中删除

powershell 复制代码
srem key member[member ...] 

时间复杂度:O(N),N是要删除的元素个数
返回值:本次删除的元素个数

集合间的操作

SINTER (交集)

powershell 复制代码
sinter key [key ...]

时间复杂度:O(N*M) ,N是最⼩的集合元素个数.M是最⼤的集合元素个数
返回值:交集的元素

SINTERSTORE

作用:获取给定set交集中的元素并保存到目标set中

powershell 复制代码
sinterstoer destination key [key ...]

时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数.
返回值:交集的元素个数

SUNION(并集)

作用:获取给定set的并集中的元素

powershell 复制代码
sunion key [key ...]

时间复杂度:O(N),N给定的所有集合的总的元素个数.
返回值:并集的元素

SUNIONSTORE

作用:获取给定set的并集中的元素并保存到目标set中

powershell 复制代码
sunionstore destination key [key ...]

时间复杂度:O(N),N给定的所有集合的总的元素个数.
返回值:并集的元素个数。

注意观察,为什么set4中的元素是有序的,而相同的并集中却是无序的?难道set的定义有误?

其实Redis的Set元素看起来是有序的 ,但这实际上是巧合和内部实现的副作用,Redis的Set在元素较少时使用 intset(整数集合) ,元素较多时使用 dict(哈希表)
目前我们应该是使用intset(元素按数值大小有序存储),而现在上述集合中元素都是单个小写字母,Redis实际上是作为ASCII码值存储的,所以才会出现set集合中有序的情况。

SDIFF(差集)

作用:获取给定set的差集中的元素

powershell 复制代码
sdiff key [key ...]


时间复杂度:O(N),N给定的所有集合的总的元素个数.
返回值:差集的元素。

SDIFFSTORE

作用:获取给定set的差集中的元素并保存到目标set中

powershell 复制代码
sdiffstore destination key [key ...]

时间复杂度:O(N),N给定的所有集合的总的元素个数.
返回值:差集的元素个数。

内部编码

intset(整数集合)(7.0以前)

当集合中的元素都是整数并且元素的个数⼩于set-max-intset-entries配置(默认512个)时,Redis会选⽤intset来作为集合的内部实现,从⽽减少内存的使⽤。

listpack(7.0+)

Redis 7.0+ 已经将Set的内部编码从 intset 改为 listpack,前面几篇博客都说过,这是redis的重大改变,虽然 listpack 是有序的数据结构,它会保持元素的插入顺序或某种内部顺序,但是set的官方文档仍然说set是无序的,所以即便出现有序情况,也不能依赖set的元素顺序。

hashtable

当集合类型⽆法满⾜intset(packlist)的条件时,Redis会使⽤hashtable作为集合的内部实现。

默认配置:
inset : 最大元素个数阈值:set-max-intset-entries: 512
packlist

  • 最大元素个数阈值:set-max-listpack-entries: 128
  • 单个元素最大字节数阈值:set-max-listpack-value: 64

注意:一旦从listpack转换为hashtable,就不会再转回listpack,即使删除元素使其小于阈值!

标签分类

集合类型⽐较典型的使⽤场景是标签(tag)

A⽤⼾对娱乐、体育板块⽐较感兴趣,B⽤⼾对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。

有了这些数据就可以得到喜欢同⼀个标签的⼈,以及⽤⼾的共同喜好的标签,这些数据对于增强⽤⼾体验和⽤⼾黏度都⾮常有帮助。

我们可以给用户添加某个标签,这个用户所拥有的标签就算一个集合

powershell 复制代码
sadd user:1:tags tag1 tag2 tag3
sadd user:2:tags tag4 tag5 tag6

利用标签计算共同爱好的用户(交集)

powershell 复制代码
sinter user:1:tags user:2:tags

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
漫随流水19 小时前
leetcode算法(344.反转字符串)
数据结构·算法·leetcode
独自破碎E19 小时前
整理一些Linux的常用命令
linux·运维·服务器
松涛和鸣20 小时前
44、HTML与HTTP服务器交互笔记
linux·运维·服务器·http·链表·html
Konwledging20 小时前
等待队列wait_queue
linux
zbguolei20 小时前
上传 Excel 文件进行数据库比对--增加导出功能
数据库·excel
amao998820 小时前
数据库原理与技术 - 3-7 视图和索引 View& Index
数据库·sql·oracle
uup20 小时前
SpringBoot 集成 Redis 缓存实践
java·redis
酸菜牛肉汤面20 小时前
30、大表数据查询,怎么优化
数据库
胡闹5420 小时前
Linux中取消默认休眠配置
linux·运维·服务器