Skip to content

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:

  1. 频道信息保存在Server的pubsub_channels字典中
  2. 订阅者信息保存在链表
  3. 消息发送是"fire and forget"模式

模式订阅

bash
# 订阅匹配模式
PSUBSCRIBE news.*
PSUBSCRIBE user:*

# 接收消息格式
1) "pmessage"
2) "news.sports"      # 匹配的频道
3) "news.sports.nba"  # 实际频道
4) "Lakers won!"      # 消息内容

面试考点

Q1: Pub/Sub的缺点?

答案

  1. 消息不持久化:离线订阅者收不到消息
  2. 无ACK确认:不保证消息送达
  3. 无法消息追溯:无消息历史
  4. 积压能力有限:内存存储

Q2: Pub/Sub vs Stream?

答案

特性Pub/SubStream
消息持久化
消息回溯
消费者组
ACK机制
使用场景实时消息消息队列

Q3: Pub/Sub的应用场景?

答案

  1. 实时消息推送
  2. 聊天室
  3. 系统通知
  4. 广播(不适合可靠性要求高的场景)

Q4: 如何保证消息不丢失?

答案

  1. 使用Stream替代Pub/Sub
  2. 配合Redis复制(但复制也可能丢数据)
  3. 使用专业的消息队列(Kafka、RocketMQ)

最后更新: