
🚀 欢迎来到我的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
📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中......
悄悄说:点击主页有更多精彩内容哦~ 😊
