maxmemory-clients 是什么
maxmemory-clients 限制所有客户端连接用于缓冲的内存总量(查询缓冲与输出缓冲),可以用占 maxmemory 的百分比(如 5%)或绝对值(如 512mb)表达。超过上限时,Redis 挑用量最大的客户端断开,避免个别慢消费者把实例内存吃光。它需要显式配置才起作用,具体当前值用 CONFIG GET 确认。
基本信息
| 语法 | 百分比形式如 5%,或绝对值形式如 512mb |
|---|---|
| 统计对象 | 客户端查询缓冲与输出缓冲 |
| 超限行为 | 按用量从大到小驱逐客户端,被驱逐方看到连接断开 |
| 确认方式 | CONFIG GET maxmemory-clients |
| 配套观测 | CLIENT LIST 中的 qbuf、omem 等缓冲字段 |
缓冲失控的常见场景
| 场景 | 表现 | 处理方向 |
|---|---|---|
| 慢消费者 | 订阅或批量读取但处理不过来,输出缓冲堆积 | 限制单次返回量,消费侧加滞后告警 |
| 大消息订阅 | Pub/Sub 单条消息过大,订阅者缓冲膨胀 | 拆分频道,或改用流式结构承载 |
| 阻塞命令堆积 | 查询缓冲随请求排队增长 | 排查阻塞命令与批量管道写法 |
| 大结果集读取 | 单次返回巨大,客户端侧长时间占用缓冲 | 分页读取,或按需取字段 |
配额与观测
配额与观测
redis-cli CONFIG GET maxmemory-clients # 当前客户端内存上限
redis-cli CONFIG SET maxmemory-clients 5% # 按 maxmemory 的百分比限制
redis-cli CONFIG SET maxmemory-clients 512mb # 或直接给绝对值
redis-cli CLIENT LIST | head -5 # 单个连接的 qbuf、omem 等缓冲字段
redis-cli INFO clients | grep -E 'client_recent_max_(input|output)_buffer'典型使用场景
- 内存告警排查:数据集不大但总内存偏高时,检查连接缓冲这类非数据占用
- 慢消费者治理:定位长期堆积输出缓冲的客户端
- 压测验证:上线前确认正常峰值缓冲用量,再定阈值
- 客户端健壮性:配合重连与重试设计,让被驱逐不至于变成业务报错
- 容器化部署:为实例划出明确的非数据内存边界
客户端缓冲与数据集内存要分开看:内存告警时若数据集不大,优先排查连接缓冲、复制缓冲这类非数据占用,再谈扩容。
阈值过小会把正常读取较大结果的客户端一并驱逐,业务侧表现为连接被无缘无故断开;设置前用压测确认正常峰值的缓冲用量。