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