Redis 发布订阅

发布订阅(Pub/Sub)是一种消息通信模式,本课学习Redis的发布订阅功能。

什么是发布订阅

发布订阅模式包含:

发布者 → 频道 → 订阅者1
              → 订阅者2
              → 订阅者3

基本命令

SUBSCRIBE:订阅频道

REDIS
# 订阅单个频道
SUBSCRIBE channel1

# 订阅多个频道
SUBSCRIBE channel1 channel2 channel3

订阅后,客户端会进入等待状态,接收消息。

PUBLISH:发布消息

REDIS
# 向频道发布消息
PUBLISH channel1 "Hello, Redis!"
(integer) 2  # 返回接收到消息的订阅者数量

UNSUBSCRIBE:取消订阅

REDIS
# 取消订阅所有频道
UNSUBSCRIBE

# 取消订阅特定频道
UNSUBSCRIBE channel1

模式订阅

PSUBSCRIBE:模式匹配订阅

REDIS
# 订阅匹配模式的频道
PSUBSCRIBE news.*  # 订阅所有以news.开头的频道

# 示例
PSUBSCRIBE user:*:notifications  # 订阅所有用户的通知频道

PUNSUBSCRIBE:取消模式订阅

REDIS
# 取消所有模式订阅
PUNSUBSCRIBE

# 取消特定模式订阅
PUNSUBSCRIBE news.*

使用场景

1. 实时消息推送

示例:实时消息推送

BASH
# 终端1:订阅消息
SUBSCRIBE notifications

# 终端2:发布消息
PUBLISH notifications "New user registered"
▶ 试一试

2. 聊天室

示例:聊天室

BASH
# 用户1:订阅聊天室
SUBSCRIBE chatroom:general

# 用户2:发送消息
PUBLISH chatroom:general "Hello everyone!"
▶ 试一试

3. 系统通知

示例:系统通知

BASH
# 管理员:订阅系统告警
SUBSCRIBE system:alerts

# 系统:发送告警
PUBLISH system:alerts "High CPU usage detected"
▶ 试一试

消息格式

订阅者收到的消息格式:

TEXT
1) "message"           # 消息类型
2) "channel1"          # 频道名称
3) "Hello, Redis!"     # 消息内容

模式订阅的消息格式:

TEXT
1) "pmessage"          # 消息类型
2) "news.*"            # 订阅的模式
3) "news:sports"       # 实际频道名称
4) "Game result!"      # 消息内容

注意事项

⚠️ 消息不持久化: 发布订阅的消息不会存储,订阅者只能收到订阅后的消息。

⚠️ 消息丢失: 如果订阅者断开连接,期间的消息会丢失。

💡 替代方案: 需要消息持久化时,使用Redis Stream或List实现消息队列。

Redis Stream(推荐)

Redis 5.0引入的Stream是更好的消息队列方案:

REDIS
# 添加消息
XADD mystream * name "Alice" action "login"
"1638361451780-0"

# 读取消息
XREAD COUNT 1 STREAMS mystream 0

# 消费者组
XGROUP CREATE mystream mygroup 0
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >

Stream vs Pub/Sub

特性 Pub/Sub Stream
消息持久化 ❌ 不持久化 ✅ 持久化
消息确认 ❌ 无确认 ✅ 支持ACK
消费者组 ❌ 不支持 ✅ 支持
历史消息 ❌ 无法获取 ✅ 可查询
适用场景 实时通知 消息队列

❓ 常见问题

Q Pub/Sub的消息会存储吗?
A 不会。Pub/Sub是"发后即忘"模式,消息不会持久化。
Q 订阅者断开后能收到历史消息吗?
A 不能。需要使用Stream或List来实现消息持久化。
Q 一个频道能有多少订阅者?
A 理论上没有限制,取决于服务器性能。

📖 小节

📝 作业

  1. 订阅练习: 使用两个终端,一个订阅频道,另一个发布消息
  2. 模式订阅: 使用PSUBSCRIBE订阅多个匹配的频道
  3. Stream练习: 使用XADD/XREAD实现一个简单的消息队列

下一课

下一课我们将学习 Redis 事务,了解Redis事务的使用方法和注意事项。

100%

🙏 帮我们做得更好

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

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