Set 与标签系统
约 490 字大约 2 分钟
布欧-Lewyon
2026-05-15
Set 是无序不重复集合,支持交、并、差运算。
基础操作
# 添加成员
SADD tags:article:1 "redis" "database" "nosql"
SADD tags:article:2 "redis" "cache" "spring"
# 查看所有成员
SMEMBERS tags:article:1
1) "redis"
2) "database"
3) "nosql"
# 判断是否存在
SISMEMBER tags:article:1 "redis" # 1
SISMEMBER tags:article:1 "java" # 0
# 集合大小
SCARD tags:article:1 # (integer) 3
# 删除成员
SREM tags:article:1 "nosql"
# 随机弹出一个成员
SPOP random:queue # 随机弹出
# 随机获取 N 个成员(不删除)
SRANDMEMBER tags:article:1 2
1) "redis"
2) "database"集合运算
# 交集(共同标签)
SINTER tags:article:1 tags:article:2
1) "redis"
# 并集(所有标签)
SUNION tags:article:1 tags:article:2
1) "redis"
2) "database"
3) "nosql"
4) "cache"
5) "spring"
# 差集(在集合 1 但不在集合 2)
SDIFF tags:article:1 tags:article:2
1) "database"
2) "nosql"
# 存储结果到新 key
SINTERSTORE common:tags tags:article:1 tags:article:2
SMEMBERS common:tags应用场景
# 标签系统
SADD article:1:tags "java" "spring" "redis"
SADD article:2:tags "java" "mysql"
SADD article:3:tags "python" "redis"
# 查找同时包含 java 和 redis 的文章
SINTER article:1:tags article:3:tags
# "redis"
# 用户关注关系
SADD user:1:following user:2 user:3
SADD user:2:following user:1 user:4
# 共同关注
SINTER user:1:following user:2:following
# 推荐关注(差集)
SDIFF user:2:following user:1:following# 在线用户
SADD online:users "user:1" "user:2" "user:3"
# 批量移除离线用户
SREM online:users "user:2"
SCARD online:users # 在线人数小结
| 命令 | 用途 | O |
|---|---|---|
SADD | 添加成员 | 1 |
SREM | 删除成员 | 1 |
SISMEMBER | 判断存在 | 1 |
SCARD | 数量 | 1 |
SMEMBERS | 全部成员 | N |
SINTER/SUNION/SDIFF | 交/并/差 | N |
SPOP | 随机弹出 | 1 |
- Set 无序不重复,适合标签系统、去重、社交关系。
SINTER查找共同点(共同标签、共同关注)。SDIFF推荐差异(你可能感兴趣)。SCARD统计独立用户数。
上一节:List 与消息队列 下一节:Sorted Set 与排行榜
