首页/数据/Redis 进阶速查/normal 客户端输出缓冲上限
内存与管理99 条

normal 客户端输出缓冲上限

普通客户端的输出缓冲默认不设限或限制宽松,大量积压会直接吃掉实例内存;按业务响应速度设置合理上限能防患于未然。

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

normal 输出缓冲是什么

普通客户端(既没订阅、也不是复制连接)的输出缓冲由 client-output-buffer-limit normal 控制,默认是 0 0 0,也就是不做任何限制。返回体积很大的命令会让服务端先把结果攒进这个缓冲再逐步发给客户端,客户端读得慢,缓冲就一直涨,吃的是 Redis 自己的内存。

基本信息

配置项client-output-buffer-limit normal
值格式硬限制 软限制 秒数
默认值0 0 0(两项限制都为 0 表示不限制)
单位字节
生效方式CONFIG SET 动态生效
配套手段maxmemory-clients 限制客户端整体内存占用

典型使用场景

  • 大结果集接口排查:某类查询把实例内存顶上去时,先确认是不是输出缓冲堆积
  • 给慢客户端设闸:客户端消费能力不可控时,用软限制自动断开积压连接
  • 容量规划:按单次查询最大返回体积反推合理的缓冲上限
  • 故障复盘:连接被服务端断开且有缓冲相关日志时,核对是否触发限制
  • 整体兜底:即使 normal 不设限,也用 maxmemory-clients 控制客户端内存占比

查看与设置

查看与设置
redis-cli CONFIG GET client-output-buffer-limit       # 一次看到 normal/replica/pubsub 三类限制
redis-cli CLIENT LIST                                 # 逐连接看 omem 与 tot-mem
redis-cli INFO clients | grep -E 'client_recent_max_output_buffer'  # 近期最大输出缓冲峰值
redis-cli CONFIG SET client-output-buffer-limit normal 268435456 67108864 60  # 硬 256MB、软 64MB、持续 60 秒
redis-cli INFO stats | grep -E 'evicted_clients'      # 有客户端被驱逐时的计数

关键字段读法

字段含义怎么用
omem该连接当前的输出缓冲占用持续增长说明对端消费跟不上
qbuf该连接的输入缓冲占用批量提交或大命令时会升高
tot-mem该连接的总内存占用用于定位吃内存的连接
client_recent_max_output_buffer近期单连接输出缓冲峰值设置上限时的实测依据
软限制的语义是:缓冲超过软限制、并且持续超过指定秒数才断开;硬限制一旦超过立即断开。两者可以只设其一,也可以同时设。
上限设得太小会把正常的大结果查询连接掐断,先用近期输出缓冲峰值做依据,再留出余量设置,并对驱逐计数加告警。

易错点

  • 只凭感觉设上限,误断正常运行的大结果查询,问题被掩盖成偶发连接失败
  • 把内存上涨都归因于数据量,忽略慢客户端造成的输出缓冲积压
  • 不监控客户端驱逐计数,连接被服务端断开却当成网络抖动反复排查
  • 在 normal 与 pubsub 之间填错位置,限制加到了另一类连接上

数据来源与参考

  • Redis 官方文档:输出缓冲限制说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌