连接数也是内存成本
每个客户端连接在 Redis 里都有常驻开销:client 结构体、查询缓冲、输出缓冲以及监听事件等,与数据量无关。几千个连接就能吃掉数百 MB,并同时占用文件描述符。连接开销往往在内存告警里最先被忽略——因为键数没变、数据没变,变的只是连接数。
基本信息
| 观测命令 | INFO clients、CLIENT LIST |
|---|---|
| 每连接开销 | client 结构 + 查询缓冲 + 输出缓冲 |
| 默认连接上限 | maxclients 默认 10000 |
| 闲置回收 | timeout 配置,默认 0 即不主动回收 |
| 输出缓冲限制 | client-output-buffer-limit,普通连接默认不限制 |
| 治理手段 | 连接池复用、CLIENT KILL、限制 maxclients |
典型使用场景
- 内存告警先看连接数:数据没涨而内存涨,先排除连接堆积
- 定位连接来源:按 name 与 addr 判断是业务池、监控采集还是人工登录
- 清理泄漏的长连接:按 idle 与 age 筛出僵尸连接
- 输出缓冲排障:慢消费者或订阅积压会让单个连接缓冲膨胀
- 容量规划:按峰值连接数预留固定内存,而不是只算数据量
最小示例
最小示例
redis-cli INFO clients # connected_clients 等概览
redis-cli CLIENT LIST # 逐连接:addr name age idle omem
redis-cli CLIENT LIST | grep -E 'idle=[0-9]{3,}' # 挑出明显闲置的连接
redis-cli CONFIG GET timeout # 闲置连接超时设置
redis-cli CONFIG GET maxclients # 连接上限
redis-cli CLIENT KILL TYPE normal # 慎用:会断开所有普通连接CLIENT LIST 关键列
| 列 | 含义 | 异常信号 |
|---|---|---|
| addr | 来源 IP 与端口 | 集中在少数机器说明连接池配置不合理 |
| name | CLIENT SETNAME 设置的名字 | 为空说明代码没设名字,排障只能靠 IP 反查 |
| age | 连接建立至今秒数 | 只增不减说明连接不被回收 |
| idle | 距上次命令的秒数 | 大量高 idle 连接是短连接未复用或被泄漏 |
| omem | 该连接输出缓冲占用 | 持续增长说明消费者太慢或订阅积压 |
| qbuf / qbuf-free | 查询缓冲已用与剩余 | qbuf 异常大说明单条命令参数过大 |
连接开销是常驻成本:连接数翻倍往往直接体现为内存与句柄双告警。发现短连接风暴时,先上连接池,再加内存只是拖延。
tcp-keepalive 与 timeout 是两层不同的保险:前者做保活探测,后者按闲置秒数断开。开 timeout 前确认业务有重连与重试逻辑,否则会把连接堆积变成连接抖动。