首页/数据/数据库速查/Pub/Sub 发布订阅(广播模式)
Redis 运维与场景124 条

Pub/Sub 发布订阅(广播模式)

SUBSCRIBE/PSUBSCRIBE 订阅频道,PUBLISH 发布:消息即发即弃,不持久化、无 ACK、离线订阅者收不到;适合实时通知/配置广播,不适合可靠队列。

数据库速查数据更新于 2026-10-13

Pub/Sub 是什么

Pub/Sub 是 Redis 的发布订阅模式:发布者用 PUBLISH 把消息投到频道,所有订阅该频道的客户端都会收到。消息即发即弃,不落盘、不排队、没有确认,订阅者掉线期间的消息永久丢失,因此它是广播信号而不是可靠队列。

基本信息

发布PUBLISH channel message,返回收到消息的订阅者数
订阅SUBSCRIBE channel 精确订阅,PSUBSCRIBE pattern 模式订阅
观察PUBSUB CHANNELS / NUMSUB / NUMPAT 查看频道与订阅规模
投递语义至多一次,不重发、不存储、无确认
集群表现PUBLISH 广播到所有节点,频道在集群内全局可见

典型使用场景

  • 实时通知推送:配置变更、缓存失效信号广播给所有业务实例
  • 在线状态与聊天室广播:在线用户互发消息,允许少量丢失
  • 多实例本地缓存同步:一个实例改数据,其余实例收到信号清本地缓存
  • 监控与调试:订阅内部频道观察系统事件流,丢了也不影响业务
  • 不适用可靠任务下发:需要 ACK、重试、回溯时应改用 Streams 或消息中间件

订阅与发布

订阅与发布
# 终端 A:订阅(进入订阅模式后阻塞)
SUBSCRIBE news.channel
PSUBSCRIBE news.*

# 终端 B:发布与观察
PUBLISH news.channel hello
PUBSUB CHANNELS news.*        # 列出活跃频道
PUBSUB NUMSUB news.channel    # 该频道的订阅者数量
PUBSUB NUMPAT                 # 模式订阅总数

Pub/Sub 与 Streams 对比

维度Pub/SubStreams
投递语义至多一次,消息即发即弃至少一次,消息持久保存
订阅者离线消息永久丢失,重连要重新订阅可从历史 ID 或 PEL 继续消费
多消费组不支持,所有订阅者拿到全量支持消费者组,按组独立消费
消费确认无 ACK 机制XACK 确认,未确认进 PEL
运维成本极低,无需清理需要裁剪与 PEL 清理
进入订阅模式的连接不能执行普通命令(RESP2 协议下只允许少数几个),因此订阅连接与读写连接要分开管理。
把 Pub/Sub 当任务队列用:消费端重启、网络抖动或短暂阻塞期间的消息无人接管,直接消失且没有任何补偿手段。

易错点

  • 拿 Pub/Sub 当任务队列:消费端重启期间的消息永久丢失,业务侧看不出报错
  • 订阅连接复用普通命令:进入订阅模式后命令被拒绝,代码报错难以定位
  • 以为 PSUBSCRIBE 会去重:一个客户端同时精确订阅与模式订阅同一频道会收到两条
  • 集群下用频道数量评估规模:PUBLISH 全局广播,热点频道会放大所有节点的压力

数据来源与参考

  • Redis 官方文档: Pub/Sub
  • Redis 官方文档: SUBSCRIBE

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌