首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Redis 系列】常用数据结构---SET类型

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

作者头像
optimistic_chen
发布2026-01-15 12:44:57
发布2026-01-15 12:44:57
1340
举报

🚀 欢迎来到我的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中

代码语言:javascript
复制
# 语法
SADD key member [member]
在这里插入图片描述
在这里插入图片描述

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

SMEMBERS

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

代码语言:javascript
复制
smembers key
在这里插入图片描述
在这里插入图片描述

返回值:所有元素的列表

SISMEMBER

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

代码语言:javascript
复制
sismember key member
在这里插入图片描述
在这里插入图片描述

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

SCARD

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

代码语言:javascript
复制
scard key
在这里插入图片描述
在这里插入图片描述

返回值:set内的元素个数

SPOP

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

代码语言:javascript
复制
spop key [count]
在这里插入图片描述
在这里插入图片描述

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

SMOVE

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

代码语言:javascript
复制
smove source destination member
在这里插入图片描述
在这里插入图片描述

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

SREM

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

代码语言:javascript
复制
srem key member[member ...] 
在这里插入图片描述
在这里插入图片描述

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

集合间的操作

SINTER (交集)

代码语言:javascript
复制
sinter key [key ...]
在这里插入图片描述
在这里插入图片描述

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

SINTERSTORE

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

代码语言:javascript
复制
sinterstoer destination key [key ...]
在这里插入图片描述
在这里插入图片描述

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

SUNION(并集)

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

代码语言:javascript
复制
sunion key [key ...]
在这里插入图片描述
在这里插入图片描述

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

SUNIONSTORE

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

代码语言:javascript
复制
sunionstore destination key [key ...]
在这里插入图片描述
在这里插入图片描述

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

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

其实Redis的Set元素看起来是有序的,但这实际上是巧合和内部实现的副作用,Redis的Set在元素较少时使用 intset(整数集合),元素较多时使用 dict(哈希表)

目前我们应该是使用intset(元素按数值大小有序存储),而现在上述集合中元素都是单个小写字母,Redis实际上是作为ASCII码值存储的,所以才会出现set集合中有序的情况。

SDIFF(差集)

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

代码语言:javascript
复制
sdiff key [key ...]
在这里插入图片描述
在这里插入图片描述

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

SDIFFSTORE

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

代码语言:javascript
复制
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⽤⼾对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。 有了这些数据就可以得到喜欢同⼀个标签的⼈,以及⽤⼾的共同喜好的标签,这些数据对于增强⽤⼾体验和⽤⼾黏度都⾮常有帮助。

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

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

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

代码语言:javascript
复制
sinter user:1:tags user:2:tags

完结撒花!🎉

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

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen 📌 收藏本文,下次需要时不迷路!

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


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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SET(集合)类型
  • 普通命令
    • SADD
    • SMEMBERS
    • SISMEMBER
    • SCARD
    • SPOP
    • SMOVE
    • SREM
  • 集合间的操作
    • SINTER (交集)
      • SINTERSTORE
    • SUNION(并集)
      • SUNIONSTORE
    • SDIFF(差集)
      • SDIFFSTORE
  • 内部编码
    • intset(整数集合)(7.0以前)
    • listpack(7.0+)
    • hashtable
  • 标签分类
  • 完结撒花!🎉
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档