Redis如何统计全网匹配模式的订阅者总数

张开发
2026/4/10 2:17:23 15 分钟阅读

分享文章

Redis如何统计全网匹配模式的订阅者总数
用 PUBSUB NUMPAT 可直接获取当前 Redis 服务器中活跃的模式订阅行为总数它返回的是 PSUBSCRIBE 调用次数即模式订阅条目数而非客户端数量该命令时间复杂度为 O(1)基于内部计数器 server.pubsub_patterns_count。怎么查模式订阅者总数用 PUBSUB NUMPAT 最直接Redis 本身不提供“所有模式订阅者加总”的原子命令但 PUBSUB NUMPAT 能直接返回当前服务器中被订阅的**模式总数**即 PSUBSCRIBE 的数量而不是人数。这个值代表有多少个「模式订阅行为」正在生效每个行为可能来自一个或多个客户端注意同一个 client 可多次 PSUBSCRIBE 不同模式也会被分别计数。执行方式很简单redis-cli PUBSUB NUMPAT返回结果就是一个整数比如 3表示当前有 3 个活跃的模式订阅如 client A 订阅了 logs.*client B 订阅了 user:* 和 order:failed那总数就是 3。它不区分客户端也不展开每个模式下有多少人——这是设计使然不是 bug该命令开销极小时间复杂度为 O(1)因为 Redis 内部只维护一个全局计数器 server.pubsub_patterns_count如果你误以为它返回的是“人头数”就容易高估实际监听规模真实订阅者数量需结合 CLIENT LIST 过滤 分析为什么不能靠 PUBSUB NUMSUB 查模式订阅者PUBSUB NUMSUB 只对**频道channel** 有效对模式pattern完全无响应。即使你传入一个 pattern 字符串比如 PUBSUB NUMSUB news.*Redis 会把它当做一个字面频道名去查而不会做模式匹配——结果几乎总是 0除非真有人 SUBSCRIBE 了一个叫 news.* 的频道带星号的字符串频道名是合法的但极少有人这么用。模式订阅和频道订阅在 Redis 内部分属两套机制pubsub_channels 字典 vs pubsub_patterns 链表NUMSUB 查的是前者键对应的链表长度NUMPAT 查的是后者链表节点总数试图用 NUMSUB 碰运气查模式只会得到误导性零值想估算真实模式订阅者人数得手动关联 CLIENT LISTRedis 没有内置命令能列出“谁在监听哪个模式”但你可以通过 CLIENT LIST 获取所有连接并筛选出处于 Pub/Sub 状态的客户端再结合其订阅上下文需应用层记录或调试日志辅助做交叉判断。生产环境不推荐实时扫全量 client 列表来统计但可作为临时排障手段 Felvin AI无代码市场只需一个提示快速构建应用程序

更多文章