Redis 发布订阅
发布订阅(Pub/Sub)是一种消息通信模式,本课学习Redis的发布订阅功能。
什么是发布订阅
发布订阅模式包含:
- 发布者(Publisher):发送消息到频道
- 订阅者(Subscriber):接收频道的消息
- 频道(Channel):消息通道
发布者 → 频道 → 订阅者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 理论上没有限制,取决于服务器性能。
📖 小节
- Pub/Sub是发布订阅模式,PUBLISH发布、SUBSCRIBE订阅
- 支持模式匹配订阅(PSUBSCRIBE)
- 消息不持久化,适合实时通知场景
- 需要消息持久化时,使用Redis Stream
- Stream支持消费者组、消息确认、历史查询
📝 作业
- 订阅练习: 使用两个终端,一个订阅频道,另一个发布消息
- 模式订阅: 使用PSUBSCRIBE订阅多个匹配的频道
- Stream练习: 使用XADD/XREAD实现一个简单的消息队列
下一课
下一课我们将学习 Redis 事务,了解Redis事务的使用方法和注意事项。



