详解redis(9):数据结构set

一、Redis Set 是什么

Set = 不重复 + 无顺序的集合

一个 自动去重不关心顺序 的容器

二、Set 和 List 的本质区别

对比项 List Set
是否允许重复 ✅ 允许 ❌ 不允许
是否有顺序 ✅ 有顺序(下标) ❌ 无序
能否按下标访问 ✅ LINDEX ❌ 不支持
是否支持集合运算 ✅ 交集 / 并集 / 差集
典型使用场景 消息队列、时间线 去重、关系、标签

三、Set 能干什么

交集(共同好友)

bash 复制代码
SINTER user:1:friends user:2:friends

并集(所有好友)

bash 复制代码
SUNION user:1:friends user:2:friends

差集(你有我没有)

bash 复制代码
SDIFF user:1:friends user:2:friends

四、底层结构一:整数集合

使用条件(必须同时满足)

所有元素都是整数

元素个数 < 512(默认,可配置)

本质:连续内存数组

特点:

有序存储(但对外仍然无序)

紧凑、节省内存

使用二分查找

只支持整数

五、底层结构二:哈希表

什么时候用?

元素不是纯整数

或元素数量很多

优点

O(1) 级别的增删查

支持任意字符串

支持大规模数据

缺点

内存占用比 intset 高

有 rehash 成本

六、两种实现对比总结

维度 intset hash table
元素类型 仅整数 任意
数据规模 小(<512)
内存占用 极低 较高
查询方式 二分查找 哈希
是否自动升级 → hash 不可降级

七、为什么抽奖活动非常适合用 Set?

抽奖的核心需求其实就 4 个字:

去重 + 随机

抽奖需求 Set 特性
同一用户不能重复参与 Set 天然去重
参与顺序无所谓 Set 无序
随机抽人 SRANDMEMBER / SPOP
统计参与人数 SCARD
相关推荐
冰暮流星8 分钟前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发33 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐1 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly1 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客1 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.1 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐1 小时前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99991 小时前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学2 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.2 小时前
Mysql
数据库·mysql