首页/数据/Redis 进阶速查/pubsub 输出缓冲与慢订阅者
内存与管理99 条

pubsub 输出缓冲与慢订阅者

发布订阅客户端的输出缓冲由 client-output-buffer-limit pubsub 控制,慢消费者会让缓冲堆积并最终被断开。

Redis 进阶速查数据更新于 2026-10-13

订阅连接的输出缓冲限制

发布订阅连接使用独立的输出缓冲限制项 client-output-buffer-limit pubsub,默认量级是 32mb 8mb 60,即硬上限 32mb、软上限 8mb 且持续 60 秒。订阅端消费速度跟不上发布速率时,消息在服务端缓冲里堆积,一旦触限,服务端直接断开这条订阅连接。断开是保护实例的动作,但订阅端会丢消息,业务必须有重连与补齐机制,否则数据会静默缺失。

基本信息

配置项client-output-buffer-limit pubsub
默认取值32mb 8mb 60
三个数值硬限 / 软限 / 软限持续秒数
超限行为服务端断开该连接
观测命令PUBSUB CHANNELS、PUBSUB NUMSUB
连接级查看CLIENT LIST 中的缓冲字段
配套项maxmemory-clients 提供总量兜底

典型使用场景

  • 热点频道出现订阅端掉线,判断是否被输出缓冲限制断开
  • 设计订阅端消费模型时,评估缓冲上限与消费能力是否匹配
  • 排查订阅端重连风暴,确认断连来自服务端还是客户端网络
  • 为关键频道单独规划容量,避免大频道挤占实例内存
  • 压测发布速率上限,量化实例能承受的广播规模
  • 与连接驱逐指标联合观测,区分单连接超限与总量超限

查看与观测

查看与观测
redis-cli CONFIG GET client-output-buffer-limit   # 三类限制一起看
redis-cli PUBSUB CHANNELS                          # 当前活跃频道
redis-cli PUBSUB NUMSUB news.hot                   # 指定频道的订阅数
redis-cli CLIENT LIST TYPE pubsub                  # 只看订阅连接
redis-cli INFO stats | grep -E 'evicted_clients'   # 连接驱逐计数
redis-cli INFO memory | grep -E 'used_memory'      # 缓冲是否推高内存

输出缓冲限制三类

类别约束对象默认情况
normal普通命令连接默认不限制
pubsub订阅连接硬限 32mb 量级
replica副本连接另有独立默认值
断开慢订阅者只保护了实例,消息丢失的业务影响必须提前设计:订阅端重连后要能补齐断连窗口内的数据。
订阅端重连风暴会带来连接数与缓冲的双重压力,客户端重试要带退避。
软限配合秒数判断的是持续性堆积,偶发的一小段积压不会立刻断连,长期稳定的高缓冲才会触发。

易错点

  • 把慢订阅者被断开当成客户端 bug,忽略服务端缓冲限制的因果
  • 订阅端没有补齐机制,被断开期间的消息直接丢失且不易发现
  • 对热点频道不设订阅数上限,单个大频道把实例内存拖垮
  • 订阅端无退避重连,故障期间形成连接与缓冲的双重风暴
  • 只看内存总量不看连接级缓冲,定位不到具体是哪条连接在堆积

数据来源与参考

  • Redis 官方文档:Pub/Sub 缓冲限制
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌