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。

笔记加载中…