查询缓冲:大命令的内存账
客户端发来的命令要先在服务端拼装成完整请求才能执行,这部分内存记在客户端头上,称为查询缓冲。当单条命令的参数特别多、特别大时(例如一次传入几万个字段的批量写),查询缓冲会瞬间抬高进程内存。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 长时间占用,导入窗口选在业务低峰能同时缓解两边压力。