redis客户端输出缓冲区必须显式配置client-output-buffer-limit,否则普通客户端无硬性上限,pubsub类易因消息积压导致缓冲区暴涨、内存耗尽甚至oom;需区分normal、pubsub、slave三类分别设限,soft-limit与soft-seconds需匹配业务心跳,hard-limit不可为0,且须验证配置生效。

必须显式配置 client-output-buffer-limit,否则普通客户端无硬性上限,pubsub 类型尤其容易因消息积压导致缓冲区暴涨、内存耗尽甚至 OOM。
明确区分三类客户端并分别设限
Redis 输出缓冲区按使用场景分为 normal、pubsub、slave 三类,限制逻辑和风险点不同,不能共用同一套数值:
-
normal:对应常规命令响应(如
LRANGE biglist 0 -1、HGETALL hugehash),缓冲区膨胀多因单次返回过大或 pipeline 响应未及时读取;建议设为client-output-buffer-limit normal 16mb 8mb 30(硬限 16MB,软限 8MB 持续超限 30 秒断连) -
pubsub:高危场景。发布者不感知消费者状态,一条
PUBLISH可能向多个慢订阅者各复制一份消息。必须单独严控,例如client-output-buffer-limit pubsub 32mb 8mb 60 -
slave:主从同步中主节点为从节点维护的缓冲区(新版已逐步由 repl-backlog 替代,但旧版或大写负载下仍生效),若同步延迟长、写入密集,易触发断连;可设为
client-output-buffer-limit slave 512mb 128mb 120,但需确保主机内存充足
合理设置 soft-limit 与 soft-seconds 的配合关系
soft 机制不是“宽松版 hard”,而是防止瞬时抖动误杀的保护逻辑,关键在时间窗口要匹配业务心跳节奏:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 若客户端每 20 秒发一次
PING或CLIENT REPLY ON,则soft-seconds至少设为 30,避免刚超软限就被断开 - soft-limit 不宜过小——比如设成 1MB 而实际平均响应 1.2MB,会导致频繁断连重连;应略高于正常峰值,留出安全余量
- hard-limit 绝对不能为 0(即禁用),否则失去兜底能力;生产环境推荐设为明确值,如 normal 类 16–64MB,pubsub 类 16–64MB,依据消息体平均大小 × 并发订阅数 × 容忍积压时长估算
上线前主动监控与验证
配置生效后需持续观察,不能仅依赖静态设置:
- 用
redis-cli CLIENT LIST查看每个连接的omem字段(单位字节),重点关注cmd=subscribe或psubscribe的连接是否持续增长 - 结合
INFO memory中的used_memory_human和mem_fragmentation_ratio判断是否由输出缓冲区异常引发内存陡增(db 键数量稳定但内存飙升是典型信号) - 模拟慢消费压测:启动一个订阅客户端但暂停读取,观察
omem上涨速度与配置阈值是否匹配,确认断连行为符合预期
避开常见配置陷阱
很多线上问题源于看似合理实则失效的写法:
- 写成
client-output-buffer-limit normal 0 0 0:三个 0 表示完全关闭限制,等同于裸奔 - 只配了 pubsub 却漏掉 normal:大 key 全量拉取照样可能撑爆内存
- 单位混淆:如写
32m(Redis 解析为 32 字节)而非32mb,导致限制形同虚设 - 修改后未重启或未执行
CONFIG REWRITE:配置未真正加载,CONFIG GET client-output-buffer-limit*可验证当前生效值










