Redis 发布订阅 Pub/Sub
发布订阅(Publish/Subscribe)是 Redis 内置的轻量消息范式:发布者向"频道"发消息,所有订阅该频道的客户端都能实时收到。它解决"一对多实时广播"问题,适合在线聊天室、系统通知、配置热更新、缓存失效广播等场景,特点是极简单、实时性好,但消息不落地。
订阅与发布
需要两个终端:终端 1 先订阅,终端 2 再发布。订阅后该连接进入监听状态,不再处理其他命令:
# 终端 1:订阅频道 news
SUBSCRIBE news
# 输出:1) "subscribe"
# 2) "news"
# 3) (integer) 1
# 终端 2:向 news 发布一条消息
PUBLISH news "系统将于今晚 24 点升级"
# 输出:(integer) 1 # 有 1 个订阅者收到
终端 1 随即收到三元组:类型 message、频道名 news、消息内容。
查看频道状态
PUBSUB 系列命令查看订阅关系:
PUBSUB CHANNELS
# 输出:1) "news" # 当前有订阅者的频道
PUBSUB NUMSUB news
# 输出:1) "news"
# 2) (integer) 1 # 该频道 1 个订阅者
没有任何订阅者时 CHANNELS 返回 (empty array)。
模式订阅
PSUBSCRIBE 支持通配符模式,一个订阅匹配多个频道;收到消息时返回的是 pmessage,带匹配的模式:
# 终端 1:订阅 news 下所有子频道
PSUBSCRIBE news.*
# 输出:1) "psubscribe" 2) "news.*" 3) (integer) 1
# 终端 2
PUBLISH news.sports "比分 2:1"
# 输出:(integer) 1
终端 1 收到:1) pmessage 2) 匹配模式 news.* 3) 实际频道 news.sports 4) 内容。
fire-and-forget 特性与坑
Pub/Sub 本质是"发了就不管"(fire-and-forget):
- 消息不持久化,不写 RDB/AOF,Redis 重启即全部丢失;
- 发布时没有订阅者,消息直接丢弃、不会补发;
- 订阅者断线重连期间的消息收不到,不支持离线消息;
- 订阅连接处于阻塞监听状态,业务上通常用独立连接做订阅。
因此它适合实时通知、广播、触发类场景,不适合支付回调、任务队列等"必须送达、可重试"的需求——那些用 Stream 或专业消息队列。
扩展与注意
- 广播语义:多个订阅者各自都会收到同一条消息,不存在竞争消费;
- 取消订阅用 UNSUBSCRIBE / PUNSUBSCRIBE;
- Redis 7.0 起提供分片频道(SSUBSCRIBE / SPUBLISH),消息只在同一分片传播,适合与集群配合的定向通知。
小结
Pub/Sub 三件套:SUBSCRIBE 订阅、PUBLISH 发布、PSUBSCRIBE 模式订阅。优点是轻量与实时,缺点是消息不落地、订阅者不在线就丢。记住一句话:实时广播用它,可靠消息用 Stream。