Appearance
Redis 发布订阅(Pub/Sub)
基本概念
Pub/Sub是Redis的消息发布/订阅模式,允许发布者向频道发送消息,订阅者接收消息。
基本命令
发布者
bash
# 发布消息
PUBLISH channelName message
# 示例
PUBLISH news " Breaking news!"
PUBLISH chat "Hello everyone"订阅者
bash
# 订阅频道
SUBSCRIBE channelName
# 订阅多个频道
SUBSCRIBE news chat
# 模式订阅(通配符)
PSUBSCRIBE news.*
# 取消订阅
UNSUBSCRIBE channelName
PUNSUBSCRIBE news.*工作原理
结构
Publishers Channels Subscribers
| | |
|--- PUBLISH ------>| |
| |--- DELIVER ------>|
| | |
|--- PUBLISH ------>| |
| |--- DELIVER ------>|实现细节
Redis的Pub/Sub:
- 频道信息保存在Server的pubsub_channels字典中
- 订阅者信息保存在链表
- 消息发送是"fire and forget"模式
模式订阅
bash
# 订阅匹配模式
PSUBSCRIBE news.*
PSUBSCRIBE user:*
# 接收消息格式
1) "pmessage"
2) "news.sports" # 匹配的频道
3) "news.sports.nba" # 实际频道
4) "Lakers won!" # 消息内容面试考点
Q1: Pub/Sub的缺点?
答案:
- 消息不持久化:离线订阅者收不到消息
- 无ACK确认:不保证消息送达
- 无法消息追溯:无消息历史
- 积压能力有限:内存存储
Q2: Pub/Sub vs Stream?
答案:
| 特性 | Pub/Sub | Stream |
|---|---|---|
| 消息持久化 | 无 | 有 |
| 消息回溯 | 无 | 有 |
| 消费者组 | 无 | 有 |
| ACK机制 | 无 | 有 |
| 使用场景 | 实时消息 | 消息队列 |
Q3: Pub/Sub的应用场景?
答案:
- 实时消息推送
- 聊天室
- 系统通知
- 广播(不适合可靠性要求高的场景)
Q4: 如何保证消息不丢失?
答案:
- 使用Stream替代Pub/Sub
- 配合Redis复制(但复制也可能丢数据)
- 使用专业的消息队列(Kafka、RocketMQ)
