客户端内存上限与驱逐
maxmemory-clients 用来限制全部客户端连接占用的内存总量(主要是输入输出缓冲),超过上限时 Redis 会挑出占用最高的连接断开,并在 INFO stats 的 evicted_clients 里累计次数。它保护的是实例本身:一个慢消费者或大范围查询的客户端就可能吃掉大量缓冲,进而触发键淘汰甚至内存耗尽。客户端侧只能看到连接被断开,真实原因要回到服务端指标与日志里找。该限制默认关闭,必须显式配置比例或绝对值后才生效。
基本信息
| 配置项 | maxmemory-clients |
|---|---|
| 默认值 | 0,表示不限制 |
| 取值形式 | 绝对值(如 200mb)或百分比(如 5%) |
| 出现版本 | Redis 7.0 起 |
| 驱逐计数 | INFO stats 的 evicted_clients |
| 单连接占用 | CLIENT LIST 的缓冲相关字段 |
| 关系 | 与 client-output-buffer-limit 互补,做总量兜底 |
典型使用场景
- 慢消费者把实例内存吃满,需要先设总量上限止损
- 排查业务侧连接中断,确认是否被服务端主动驱逐
- 为多业务共用实例设置连接内存兜底,避免互相影响
- 评估订阅场景的内存风险,量化缓冲占总内存的比例
- 容量规划时把客户端缓冲单独建账,而不是笼统算进数据区
- 定位大范围查询引发的内存尖峰,用连接级缓冲数据佐证
查看与设置
查看与设置
redis-cli CONFIG GET maxmemory-clients # 当前上限
redis-cli CONFIG SET maxmemory-clients 5% # 按最大内存比例设置
redis-cli INFO stats | grep -E 'evicted_clients' # 驱逐次数
redis-cli CLIENT LIST | head -5 # 看各连接缓冲占用
redis-cli CLIENT LIST | grep -E 'tot-mem' # 单连接内存字段
redis-cli INFO clients # 连接总数与峰值缓冲客户端内存的三个视角
| 指标 | 看什么 | 用途 |
|---|---|---|
| evicted_clients | 累计驱逐次数 | 确认是否发生过保护性断连 |
| CLIENT LIST 缓冲字段 | 单连接占用 | 定位是哪个客户端吃内存 |
| maxmemory-clients | 总量上限 | 实例级兜底 |
出现驱逐先找缓冲来源:大范围查询结果、消费太慢的订阅者、以及跟不上主库的副本连接都是常见大户。
把连接中断直接归因为网络抖动是最常见的误判,先看 evicted_clients 有没有增长。