*Redis PUB-SUB 命令

PUB-SUB(发布/订阅)是 Redis 的消息通信模式,支持客户端通过频道(Channel)进行消息广播。这是一个系统概述,不是单个命令。


*语法

PUB-SUB 包含以下核心命令:

PUBLISH channel message
SUBSCRIBE channel [channel ...]
PSUBSCRIBE pattern [pattern ...]
UNSUBSCRIBE [channel [channel ...]]
PUNSUBSCRIBE [pattern [pattern ...]]
PUBSUB subcommand [argument ...]

*参数说明

参数 类型 必填 说明
channel String 是 频道名称
message String 是 要发布的消息内容
pattern String 是 频道匹配模式(支持 glob 风格)
subcommand String 是 PUBSUB 的子命令

*返回值

  • PUBLISH:返回接收到消息的客户端数量(Integer)
  • SUBSCRIBE/PSUBSCRIBE:返回订阅确认消息数组
  • PUBSUB:取决于子命令,返回频道列表、订阅数量等

*时间复杂度

  • PUBLISH: O(N),N 为订阅该频道的客户端数量
  • SUBSCRIBE/PSUBSCRIBE: O(1) 每个频道/模式
  • PUBSUB: O(N),N 为活跃的频道或订阅数量

*示例

*发布与订阅消息

# 客户端 A
> SUBSCRIBE news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1

# 客户端 B
> PUBLISH news "hello world"
(integer) 1

*模式订阅

> PSUBSCRIBE news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1

> PUBLISH news.sports "score update"
(integer) 1

*查看订阅信息

> PUBSUB CHANNELS
1) "news"
2) "chat"

> PUBSUB NUMSUB news chat
1) "news"
2) (integer) 2
3) "chat"
4) (integer) 1

*常见错误

错误 原因 解决
订阅后无法执行其他命令 客户端进入订阅模式后只能接收消息 使用单独的连接进行订阅,或使用 SSUBSCRIBE(Redis 7.0+)
消息丢失 订阅者未连接时发布消息 使用 Stream 或记录消息到持久化存储
模式匹配不生效 模式语法错误 检查 glob 模式语法是否正确

*最佳实践

  • 使用专用连接进行订阅,避免阻塞其他操作
  • 对于需要可靠投递的场景,考虑使用 Redis Stream 替代 PUB-SUB
  • 合理设计频道命名规范,如 service:entity:event 格式
  • 监控频道数量和消息吞吐量,避免频道过多影响性能
  • 使用 PUBSUB NUMSUB 监控订阅情况,及时发现异常

*FAQ

Q1: PUB-SUB 消息持久化吗? A: 不持久化。如果没有订阅者在线,消息会丢失。需要持久化请使用 Redis Stream 或消息队列。

Q2: SUBSCRIBE 和 PSUBSCRIBE 可以同时使用吗? A: 可以,一个客户端可以同时使用 SUBSCRIBE 订阅具体频道和 PSUBSCRIBE 订阅模式。

Q3: PUB-SUB 支持集群模式吗? A: 支持,但消息只广播到目标频道所在节点的订阅者。需要使用全局频道或特定客户端处理集群模式下的广播。