*Redis PUBSUB 命令

PUBSUB 查看发布/订阅系统的状态信息,支持多个子命令。


*语法

PUBSUB subcommand [argument ...]

*参数说明

参数 类型 必填 说明
subcommand String 子命令:CHANNELS、NUMSUB、NUMPAT
argument String 子命令的参数

*子命令说明

子命令 说明
CHANNELS [pattern] 返回当前有订阅者的频道列表,支持模式匹配
NUMSUB channel [channel ...] 返回指定频道的订阅者数量
NUMPAT 返回当前被模式订阅的数量(PSUBSCRIBE 的数量)

*返回值

  • CHANNELS:Array,匹配的频道名称列表
  • NUMSUB:Array,频道名称和订阅者数量交替排列
  • NUMPAT:Integer,模式订阅数量

*时间复杂度

  • CHANNELS:O(N),N 为活跃频道数量
  • NUMSUB:O(N),N 为请求的频道数量
  • NUMPAT:O(1) ---

*示例

*查看活跃频道

> PUBSUB CHANNELS
1) "news"
2) "chat:room1"
> PUBSUB CHANNELS news.*
1) "news.sports"
2) "news.tech"

*查看频道订阅者数量

> PUBSUB NUMSUB news chat:room1 notexist
1) "news"
2) (integer) 5
3) "chat:room1"
4) (integer) 3
5) "notexist"
6) (integer) 0

*查看模式订阅数量

> PUBSUB NUMPAT
(integer) 12

*常见错误

错误 原因 解决
ERR wrong number of arguments 缺少 subcommand 提供有效的子命令
ERR unknown subcommand 子命令不存在 使用 CHANNELS、NUMSUB 或 NUMPAT

*最佳实践

  • 监控和管理发布/订阅系统的核心工具,常用于查看系统状态
  • 使用 PUBSUB CHANNELS 检查活跃的频道,避免发布到无人订阅的频道
  • NUMSUB 可用于负载均衡决策,将消息发送到订阅者较少的频道
  • NUMPAT 可用于监控模式订阅的使用情况,避免过度使用模式订阅影响性能

*FAQ

Q1: PUBSUB CHANNELS 返回所有频道吗? A: 只返回当前有至少一个订阅者的频道。无订阅者的频道不会出现在列表中,即使之前有消息发布过。

Q2: NUMSUB 返回的是所有客户端数量吗? A: 返回的是普通订阅(SUBSCRIBE)该频道的客户端数量,不包括模式订阅(PSUBSCRIBE)的客户端。

Q3: PUBSUB 命令在集群模式下有什么限制? A: 在 Redis Cluster 中,PUBSUB 命令只能查看当前节点上的发布/订阅状态。集群模式下 Pub/Sub 默认不跨节点传播(需开启 cluster-mode 或专用配置)。