以下是 Redis 中 集合(Set)类型 的系统化讲解,适用于去重统计、标签分类、共同好友、抽奖池等多种场景。内容包含命令大全、典型用法、进阶技巧与注意事项。


📚 目录

  1. 集合简介
  2. 核心命令一览
  3. 典型使用场景
  4. 高级操作与技巧
  5. 注意事项与性能建议
  6. 参考资料

🧾 集合简介

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),随时告诉我!