Redis 集合(上)
集合是无序不重复的字符串集合,本课学习集合的基本操作。
什么是集合?
集合类似于编程语言中的集合:
- Python的set
- JavaScript的Set
- Java的HashSet
集合的特点:
- 无序:元素没有顺序
- 不重复:自动去重
- 支持集合运算:交集、并集、差集
基本命令
SADD:添加元素
REDIS
# 添加单个元素
SADD myset "a"
(integer) 1
# 添加多个元素
SADD myset "b" "c" "d"
(integer) 3
# 添加已存在的元素(返回0,不重复添加)
SADD myset "a"
(integer) 0
SMEMBERS:获取所有元素
REDIS
SMEMBERS myset
1) "a"
2) "b"
3) "c"
4) "d"
⚠️ 注意: SMEMBERS会返回所有元素,数据量大时可能阻塞。生产环境建议使用SSCAN。
SISMEMBER:检查元素是否存在
REDIS
SISMEMBER myset "a"
(integer) 1
SISMEMBER myset "z"
(integer) 0
SCARD:获取集合大小
REDIS
SCARD myset
(integer) 4
SREM:删除元素
REDIS
SREM myset "a"
(integer) 1
SREM myset "z"
(integer) 0
SPOP:随机弹出元素
REDIS
# 随机弹出一个元素
SPOP myset
"b"
# 随机弹出2个元素
SPOP myset 2
1) "c"
2) "d"
SRANDMEMBER:随机获取元素(不删除)
REDIS
SADD myset2 "x" "y" "z"
# 随机获取1个元素
SRANDMEMBER myset2
"x"
# 随机获取2个元素(不重复)
SRANDMEMBER myset2 2
1) "y"
2) "z"
# 随机获取2个元素(可能重复)
SRANDMEMBER myset2 -2
1) "x"
2) "x"
应用场景
| 场景 | 说明 |
|---|---|
| 标签系统 | 用户标签、文章标签 |
| 社交关系 | 好友列表、关注列表 |
| 去重 | 唯一计数、UV统计 |
| 抽奖 | 随机抽取中奖者 |
示例:标签系统
BASH
# 给文章添加标签
SADD article:123:tags "redis" "database" "nosql"
# 获取文章的所有标签
SMEMBERS article:123:tags
# 检查文章是否有某个标签
SISMEMBER article:123:tags "redis"
# 删除标签
SREM article:123:tags "nosql"
示例:共同好友
BASH
# 用户1的好友
SADD friends:user1 "Alice" "Bob" "Charlie"
# 用户2的好友
SADD friends:user2 "Bob" "Charlie" "David"
# 共同好友
SINTER friends:user1 friends:user2
示例:抽奖系统
BASH
# 添加参与者
SADD lottery "user1" "user2" "user3" "user4" "user5"
# 随机抽取1个中奖者
SPOP lottery
# 随机抽取3个中奖者(不重复)
SPOP lottery 3
集合运算
SINTER:交集
REDIS
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"
SINTER set1 set2
1) "b"
2) "c"
SUNION:并集
REDIS
SUNION set1 set2
1) "a"
2) "b"
3) "c"
4) "d"
SDIFF:差集
REDIS
# set1有但set2没有的元素
SDIFF set1 set2
1) "a"
# set2有但set1没有的元素
SDIFF set2 set1
1) "d"
存储结果
REDIS
# 将交集存储到新集合
SINTERSTORE result set1 set2
(integer) 2
# 将并集存储到新集合
SUNIONSTORE result set1 set2
(integer) 4
# 将差集存储到新集合
SDIFFSTORE result set1 set2
(integer) 1
❓ 常见问题
Q SMEMBERS和SSCAN有什么区别?
A SMEMBERS一次返回所有元素,数据量大时可能阻塞。SSCAN分批返回,适合大数据量。
Q 集合最多能存储多少元素?
A 理论上2^32-1个元素(约42亿)。
Q 集合和列表有什么区别?
A 集合无序不重复,列表有序可重复。根据业务需求选择。
📖 小节
- 集合是无序不重复的字符串集合
- SADD添加、SREM删除、SMEMBERS获取所有
- SISMEMBER检查是否存在、SCARD获取大小
- 支持交集(SINTER)、并集(SUNION)、差集(SDIFF)
- 适用于标签、社交关系、去重、抽奖等场景
📝 作业
- 标签练习: 创建一个文章标签系统,为3篇文章添加不同的标签,查找有共同标签的文章
- 好友练习: 模拟3个用户的好友关系,找出任意两个用户的共同好友
- 抽奖练习: 创建一个抽奖系统,添加10个参与者,随机抽取3个中奖者
下一课
下一课我们将学习 Redis 集合(下),了解集合的高级操作和运算。



