Set 集合类型
掌握 Set 类型的特点与常用命令
理解集合的交并差运算
能实现去重、标签、共同关注等场景
核心讲解
Set 是无序集合,元素唯一不重复,支持交、并、差集运算,适合去重和集合计算场景。
(1)核心特点
元素唯一,自动去重
无序,不能按下标访问
支持集合运算:交集、并集、差集
添加、删除、判断存在都很快
(2)常用命令
表格
命令 | 功能 |
|---|---|
| 添加元素 |
| 获取所有元素 |
| 判断是否是成员 |
| 集合元素数量 |
| 删除元素 |
| 随机弹出几个元素 |
| 随机获取几个元素,不弹出 |
| 交集 |
| 并集 |
| 差集 |
(3)适用场景
去重:用户标签、访问 IP 去重、点赞用户去重
共同好友、共同关注、共同标签
随机抽奖:SPOP 随机弹出
权限、角色集合
操作示例
# ===== 基础操作 =====
# 添加标签
SADD user:1:tags java python sql
SADD user:2:tags java redis mysql
# 查看所有
SMEMBERS user:1:tags
# 判断是否存在
SISMEMBER user:1:tags java
# 数量
SCARD user:1:tags
# 删除
SREM user:1:tags sql
# ===== 随机 =====
# 随机获取2个,不删除
SRANDMEMBER user:1:tags 2
# 随机弹出1个
SPOP user:1:tags
# ===== 集合运算 =====
# 交集:两个用户都有的标签
SINTER user:1:tags user:2:tags
# 并集:所有标签
SUNION user:1:tags user:2:tags
# 差集:用户1有,用户2没有的
SDIFF user:1:tags user:2:tags
# ===== 交集存入新key =====
SINTERSTORE common_tags user:1:tags user:2:tags
SMEMBERS common_tags
常见误区
Set 是有序的:Set 是无序的,要有序用 ZSet
SMEMBERS 随便用:大集合全量取出很耗性能,生产注意
集合运算性能差:大集合做交并差运算很耗 CPU,大数据量谨慎,或者用离线计算
元素可以重复:Set 自动去重,重复添加不会报错,但不会重复存储
课后练习
给两个用户添加标签集合
计算两个用户的共同标签
实现一个抽奖功能,随机抽取 1 名中奖用户
思考:Set 和 List 的核心区别是什么?

