首页/数据/Redis 进阶速查/查询缓冲:大命令的内存账
内存与管理99 条

查询缓冲:大命令的内存账

客户端发送大命令(如巨量参数的 MSET)时,服务端需要缓存请求内容,查询缓冲计入客户端内存;单条超大命令还可能触发协议缓冲峰值。

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

查询缓冲:大命令的内存账

客户端发来的命令要先在服务端拼装成完整请求才能执行,这部分内存记在客户端头上,称为查询缓冲。当单条命令的参数特别多、特别大时(例如一次传入几万个字段的批量写),查询缓冲会瞬间抬高进程内存。client-query-buffer-limit 限制单个客户端查询缓冲的上限,默认 1gb,超过就断开该连接;proto-max-bulk-len 则限制单个批量字符串的最大长度,默认 512mb,超限直接返回协议错误。

基本信息

查询缓冲限制client-query-buffer-limit,默认 1gb
单值长度限制proto-max-bulk-len,默认 512mb
超限后果断开该客户端或返回协议错误
连接级字段CLIENT LIST 中的查询缓冲相关字段
全局峰值INFO clients 的最近峰值缓冲
常见来源批量导入、巨量参数的 MSET

典型使用场景

  • 批量导入脚本导致内存告警,需要确认贡献方是不是查询缓冲
  • 线上出现协议错误断开,核对是否触及单值长度限制
  • 设计批量写入方案时评估批次大小与内存影响
  • 排查连接被意外断开,用 CLIENT LIST 的缓冲字段定位客户端
  • 为共用实例设置更严格的查询缓冲上限,保护整体可用性
  • 评估把大批量导入拆分成多批的改造收益

查看与核对

查看与核对
redis-cli CONFIG GET client-query-buffer-limit   # 单连接查询缓冲上限
redis-cli CONFIG GET proto-max-bulk-len           # 单值最大长度
redis-cli INFO clients | grep -E 'client_recent_max_input_buffer'
redis-cli CLIENT LIST | grep -E 'qbuf'            # 连接级缓冲占用
redis-cli INFO memory | grep -E 'used_memory:'    # 整体内存走势
redis-cli MONITOR                                 # 短窗口抓现场,慎用

两类限制对照

限制项约束对象默认值
client-query-buffer-limit单连接查询缓冲总量1gb
proto-max-bulk-len单个批量字符串长度512mb
client-output-buffer-limit单连接输出缓冲按类别区分
把数百 MB 的批量导入拆成多批,既控住内存又平滑主线程负载,比单纯调大限制更稳妥。
查询缓冲峰值往往伴随单核 CPU 长时间占用,导入窗口选在业务低峰能同时缓解两边压力。

易错点

  • 超大单命令可能触及 proto-max-bulk-len 直接报协议错误,脚本重试后问题依旧
  • 批量导入高峰期内存告警常由查询缓冲贡献,却先怀疑数据量增长
  • 调大限制来绕过问题,把风险从报错转成了内存耗尽
  • 用 MONITOR 抓现场时间过长,反而拖慢实例吞吐
  • 监控只看整体内存,缺少连接级缓冲指标,定位不到具体客户端

数据来源与参考

  • Redis 官方文档:客户端内存与协议说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌