Redis Set 类型 详解 + 应用场景
Set 是 Redis 的无序集合 ,核心特点是:元素唯一、不重复、无序,底层是哈希表,增删查都是 O (1) 级别的性能。
一、Set 核心特点
- 元素唯一,自动去重:重复添加同一个元素,只会存一份。
- 无序存储:不记录插入顺序,遍历时顺序不固定。
- 支持集合运算:天然支持交集、并集、差集,是它的杀手锏功能。
- 高效操作:单个元素的增、删、判断存在,都是 O (1) 时间复杂度。
二、常用基础命令
redis
# 添加元素(自动去重)
sadd user:1001:tags "java" "redis" "mysql"
# 删除元素
srem user:1001:tags "mysql"
# 判断元素是否存在(非常常用)
sismember user:1001:tags "redis" # 返回 1 存在 / 0 不存在
# 查看所有元素
smembers user:1001:tags
# 随机取一个元素(抽奖/随机推荐用)
srandmember user:1001:tags
# 随机取一个元素并删除(队列/抽奖用)
spop user:1001:tags
三、Set 经典应用场景
1. 点赞 / 关注 / 粉丝 / 共同好友(社交场景)
Set 天生适合处理 "用户之间的关联关系",是社交系统的核心数据结构:
- 存储用户关注列表:
sadd user:1001:follows 1002 1003 - 存储用户粉丝列表:
sadd user:1002:followers 1001 - 共同好友 / 共同关注:用交集命令
sinter user:1001:follows user:1002:follows
优点:自动去重,不会重复关注;交集运算超快,实时算出共同好友。
2. 抽奖 / 随机推荐 / 秒杀(随机场景)
利用 srandmember/spop 实现随机抽取:
- 抽奖活动:把所有参与用户 ID 存到 Set,用
spop随机抽取中奖用户(抽一个删一个,防止重复中奖) - 商品 / 内容随机推荐:用
srandmember随机推荐内容,不影响原数据
3. 黑名单 / 白名单 / 权限控制
-
IP 黑名单、用户黑名单:用 Set 存,判断存在极快 redis
sadd blacklist:ip 192.168.1.100 sismember blacklist:ip 192.168.1.100 -
系统权限白名单、活动准入名单:用 Set 维护,判断存在 O (1)
4. 标签 / 分类 / 兴趣爱好(多标签场景)
给用户 / 文章打多个标签,比如用户兴趣标签、文章分类标签:
redis
sadd user:1001:interests "篮球" "电影" "音乐"
sadd article:2001:tags "技术" "redis" "后端"
可以通过交集运算,实现「推荐和你兴趣相同的用户 / 内容」。
5. 统计 UV / 独立访客(去重计数)
统计网站 / 接口的独立访客数(UV),Set 天然去重:
- 以
uv:2026-05-15为 key,每次用户访问就sadd uv:2026-05-15 用户ID - 用
scard uv:2026-05-15直接获取当日独立访客数
6. 集合运算场景(多 Set 关联分析)
这是 Set 最强大的地方,通过 sinter/sunion/sdiff 实现复杂业务:
- 交集(共同关注、共同好友)
- 并集(所有用户的合并关注列表)
- 差集(我关注了但对方没关注我的人,也就是 "我关注的人里的非粉丝")
配合 *store 命令,可以直接把运算结果存到新的 Set 里,用于后续分析。
四、Set 核心优势总结
- 自动去重,天生适合处理 "不重复数据"
- 单个元素操作极快,判断存在 O (1)
- 支持高效集合运算,社交、推荐场景必备
Redis Set 是无序、唯一的集合,核心应用在社交关系(粉丝 / 关注 / 共同好友)、抽奖随机推荐、黑名单白名单、独立访客统计、多标签管理,核心优势是自动去重、高效判断存在、支持集合运算。
Redis Set 三大核心场景:用户画像、共同好友、UV 统计
一、用户画像:存储用户标签
业务逻辑
搜集用户行为、喜好、性别、年龄段、消费等级,转换成标签,用 Set 存。
- 一个用户对应一个 Set
- 元素就是各种标签:
男生、90后、喜欢数码、高消费、爱追剧
Redis 用法
redis
# 给用户1001打标签
sadd user:1001:tag 男生 90后 喜欢数码 高消费
# 判断用户有没有某个标签
sismember user:1001:tag 喜欢数码
# 查看该用户所有画像标签
smembers user:1001:tag
为什么用 Set?
- 标签天然不重复,Set 自动去重
- 增、删、判断标签是否存在都是 O(1)
- 可以做标签交集推荐:同兴趣用户匹配
二、Set 计算用户共同好友
业务逻辑
社交场景:两个人都关注 / 都是好友 的人,就是共同好友。利用 Set 交集轻松实现。
结构设计
plaintext
user:1001:friend // 用户1001的好友列表
user:1002:friend // 用户1002的好友列表
Redis 命令
redis
# 求共同好友(交集)
sinter user:1001:friend user:1002:friend
# 把共同好友结果存起来,方便后续使用
sinterstore user:common:1001:1002 user:1001:friend user:1002:friend
底层优势
Redis 内置集合交集算法,不用自己写代码循环比对,高性能、原子操作。
三、统计 UV 独立访客
业务逻辑
UV = 一天内不重复 访问用户数。Set 最大特点:自动去重,天生适合做 UV 统计。
结构设计
按日期建 key:
plaintext
uv:2026-05-15
Redis 用法
用户每访问一次:
redis
# 加入当天访客集合,重复用户自动忽略
sadd uv:2026-05-15 userId
统计当日访客总数:
redis
# scard 获取集合元素个数,就是UV
scard uv:2026-05-15
为什么不用 List?
List 允许重复,同一个用户多次访问会存多条,还要自己去重;Set 自动去重,一行命令搞定 UV。
总结
Redis Set 是无序、元素唯一集合:
- 用户画像:存放用户各类兴趣标签,自动去重,快速判断标签;
- 共同好友 :利用集合交集,快速算出两人共同好友;
- UV 统计 :利用自动去重特性,按日期记录访客,
scard直接算出独立访客数。