PUBSUB CHANNELS 命令仅列出当前有活跃订阅者的频道名,不返回订阅者数量或连接信息;结果为空可能因订阅者全部断连、客户端未正确清理、Redis Cluster中频道位于其他节点,或频道名大小写错误。
PUBSUB CHANNELS 是唯一能直接看到当前有哪些频道正在被订阅的命令,但它不返回订阅者数量或连接信息,只列名字——别指望靠它判断“谁在听”或“听的人多不多”。
为什么 PUBSUB CHANNELS 返回结果为空?
常见错误现象是执行 PUBSUB CHANNELS 后什么也不显示,哪怕你确信有客户端正在 SUBSCRIBE。原因很实际:
- Redis 默认只统计“至少有一个订阅者”的频道;如果所有订阅者都断连(比如客户端崩溃、网络中断、未正确
UNSUBSCRIBE),频道会立刻从列表中消失 - 某些 Redis 客户端库(如早期版本的
redis-py)在异常退出时不会自动清理订阅状态,但 Redis 本身不维护“僵尸订阅”,它只看 TCP 连接是否活跃 - 如果你用的是 Redis Cluster,
PUBSUB CHANNELS只作用于当前节点,而 Pub/Sub 不跨分片——频道可能在别的 master 节点上
怎样确认某个频道真有人在监听?
单靠 PUBSUB CHANNELS 不够,得组合查:
- 先运行
PUBSUB CHANNELS pattern(比如PUBSUB CHANNELS "log.*")缩小范围,避免全量扫描影响性能 - 再对目标频道执行
PUBSUB NUMSUB channel_name,返回形如1) "channel_name" 2) (integer) 3——第二个数字才是真实在线订阅者数 - 注意:这个数值是瞬时快照,不是历史峰值;如果返回 0,大概率没人连着,但也不能完全排除刚连上还没发
SUBSCRIBE命令的极端情况
omega1.swatchsh.com
rolex1.swatchsh.com
patek1.swatchsh.com
omegawx.paydyj.com
rolexwx.paydyj.com
patekwx.paydyj.com
omegawx.watchku.com
rolexwx.watchku.com
patekwx.watchku.com
omegawx.sitezj.cn
rolexwx.sitezj.cn
patekwx.sitezj.cn
omegawx.sepis.com.cn
rolexwx.sepis.com.cn
patekwx.sepis.com.cn
在 RDM 或 Another Redis Desktop Manager 里看不到频道列表?
这不是工具问题,是设计限制:
- RDM 的“Pub/Sub”标签页本质是起一个临时
redis-cli进程跑PSUBSCRIBE *,它只收消息,不查元数据 - 没有内置调用
PUBSUB CHANNELS的 UI 入口;你得手动打开终端 tab,敲命令 - 部分旧版 RDM(v2022.x 之前)甚至不支持
PUBSUB子命令高亮,容易输错成PUBSUBCHANNELS(少空格)导致报错(error) ERR unknown commandPUBSUBCHANNELS``
真正容易被忽略的一点:Redis 的 Pub/Sub 频道名区分大小写,且不自动创建——PUBSUB CHANNELS "user" 和 PUBSUB CHANNELS "User" 是两个完全无关的结果;监控脚本里如果硬编码频道名,拼错一个字母就查不到。