Redis 集合(上)

集合是无序不重复的字符串集合,本课学习集合的基本操作。

什么是集合?

集合类似于编程语言中的集合:

集合的特点:

基本命令

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 集合无序不重复,列表有序可重复。根据业务需求选择。

📖 小节

📝 作业

  1. 标签练习: 创建一个文章标签系统,为3篇文章添加不同的标签,查找有共同标签的文章
  2. 好友练习: 模拟3个用户的好友关系,找出任意两个用户的共同好友
  3. 抽奖练习: 创建一个抽奖系统,添加10个参与者,随机抽取3个中奖者

下一课

下一课我们将学习 Redis 集合(下),了解集合的高级操作和运算。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏