以下是 Redis 中 集合(Set)类型 的系统化讲解,适用于去重统计、标签分类、共同好友、抽奖池等多种场景。内容包含命令大全、典型用法、进阶技巧与注意事项。
📚 目录
🧾 集合简介
Redis 的 Set 是一个 无序、不重复的字符串集合,底层使用 hashtable 实现。
- 自动去重,无需用户干预
- 支持集合间运算(交集、并集、差集)
- 可用于抽奖、去重、标签、关注列表等场景
- 集合中的元素是唯一的字符串
🔧 核心命令一览
命令 | 功能描述 |
---|---|
SADD key member [member ...] | 向集合添加一个或多个元素 |
SREM key member [member ...] | 移除集合中的元素 |
SISMEMBER key member | 判断元素是否存在 |
SMEMBERS key | 获取所有成员 |
SCARD key | 获取集合中元素数量 |
SPOP key [count] | 随机移除并返回一个或多个元素 |
SRANDMEMBER key [count] | 随机返回一个或多个元素(不移除) |
SMOVE source destination member | 原子地将元素从一个集合移动到另一个集合 |
SDIFF key [key ...] | 差集:存在于第一个集合但不在后续集合中的元素 |
SINTER key [key ...] | 交集:多个集合共有元素 |
SUNION key [key ...] | 并集:所有集合的所有元素 |
SDIFFSTORE dst key [key ...] | 差集结果保存到目标集合 |
SINTERSTORE dst key [key ...] | 交集结果保存到目标集合 |
SUNIONSTORE dst key [key ...] | 并集结果保存到目标集合 |
🧪 典型使用场景
✅ 用户标签系统
SADD user:1001:tags "music" "travel" "tech"
SMEMBERS user:1001:tags
✅ 抽奖系统(随机抽取)
SADD lottery:2025:user_ids 101 102 103 104
SPOP lottery:2025:user_ids # 抽中一位幸运用户
✅ 共同好友 / 兴趣匹配
SINTER friends:user:101 friends:user:102
✅ 去重集合统计(UV 统计)
SADD page:view:/about 192.168.0.1
SCARD page:view:/about # 独立 IP 数
🛠 高级操作与技巧
🔄 原子性移动元素
SMOVE online_users offline_users 1001
🎲 多个元素随机抽取
SRANDMEMBER lottery:users 3
🔍 差集、交集、并集
SDIFF group:vip group:trial # 只在 VIP 不在试用中的用户
SINTER tag:python tag:ai # 同时打了 python 和 ai 标签的文章
SUNION tag:go tag:rust # 关注 go 或 rust 的用户
⚠️ 注意事项与性能建议
注意事项 | 建议 |
---|---|
⚠ 仅支持字符串元素 | 不支持嵌套结构或对象存储 |
✅ 自动去重 | 同一个元素多次 SADD 只存一份 |
❗ 数据无序 | 获取元素顺序不确定,不能按添加顺序访问 |
🔄 集合运算成本与集合大小相关 | 尽量避免对百万级集合做交集操作 |
⏱ SPOP 会移除数据 | 抽奖场景可先 SRANDMEMBER 预览再用 SPOP 抽取 |
📎 参考资料
如你需要我生成一个基于 Redis Set 的完整抽奖系统、用户标签管理系统或共同好友推荐机制的代码样例(Python / Node.js / PHP / Java),随时告诉我!
发表回复