Redis中set类型以及应用场景

Redis Set 类型 详解 + 应用场景

Set 是 Redis 的无序集合 ,核心特点是:元素唯一、不重复、无序,底层是哈希表,增删查都是 O (1) 级别的性能。


一、Set 核心特点

  1. 元素唯一,自动去重:重复添加同一个元素,只会存一份。
  2. 无序存储:不记录插入顺序,遍历时顺序不固定。
  3. 支持集合运算:天然支持交集、并集、差集,是它的杀手锏功能。
  4. 高效操作:单个元素的增、删、判断存在,都是 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?

  1. 标签天然不重复,Set 自动去重
  2. 增、删、判断标签是否存在都是 O(1)
  3. 可以做标签交集推荐:同兴趣用户匹配

二、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 是无序、元素唯一集合:

  1. 用户画像:存放用户各类兴趣标签,自动去重,快速判断标签;
  2. 共同好友 :利用集合交集,快速算出两人共同好友;
  3. UV 统计 :利用自动去重特性,按日期记录访客,scard 直接算出独立访客数。
相关推荐
kexnjdcncnxjs1 小时前
SQL批量删除不同条件的记录_使用IN子句简化删除逻辑
jvm·数据库·python
liux35281 小时前
Kafka 4.1.1 生产环境调优与最佳实践指南
数据库·分布式·kafka
2303_821287381 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署
jvm·数据库·python
m0_609160491 小时前
React Flow 边缘错位与消失问题的根源分析与 Hooks 重构方案
jvm·数据库·python
weixin_444012931 小时前
CSS怎样调整弹性项目排列顺序_使用order属性轻松控制DOM显示顺序
jvm·数据库·python
l1t1 小时前
DeepSeek总结的PostgreSQL 18.4, 17.10, 16.14, 15.18 和 14.23 发布
数据库·postgresql
silver98861 小时前
MongoDB 和 cassadra
数据库·mongodb
iuvtsrt1 小时前
SQL处理分组聚合时的NULL值处理_利用NVL函数
jvm·数据库·python
qq_297574671 小时前
MySQL核心技术实战系列(第一篇):MySQL零基础入门:安装、配置与客户端工具使用 一、前言
数据库·mysql·adb