首页/数据/Redis 进阶速查/连接数也是内存成本
内存与管理99 条

连接数也是内存成本

每个客户端连接都有固定开销(socket 缓冲、查询/输出缓冲结构等),数千连接会带来可观的常驻内存。

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

连接数也是内存成本

每个客户端连接在 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 与端口集中在少数机器说明连接池配置不合理
nameCLIENT SETNAME 设置的名字为空说明代码没设名字,排障只能靠 IP 反查
age连接建立至今秒数只增不减说明连接不被回收
idle距上次命令的秒数大量高 idle 连接是短连接未复用或被泄漏
omem该连接输出缓冲占用持续增长说明消费者太慢或订阅积压
qbuf / qbuf-free查询缓冲已用与剩余qbuf 异常大说明单条命令参数过大
连接开销是常驻成本:连接数翻倍往往直接体现为内存与句柄双告警。发现短连接风暴时,先上连接池,再加内存只是拖延。
tcp-keepalive 与 timeout 是两层不同的保险:前者做保活探测,后者按闲置秒数断开。开 timeout 前确认业务有重连与重试逻辑,否则会把连接堆积变成连接抖动。

易错点

  • 把连接数当纯网络问题:它同时消耗内存与文件描述符,几千连接就可能压到句柄上限
  • 短连接风暴期靠加内存解决:CPU 与内存同时承压,根治手段是连接池复用
  • 用 CLIENT KILL 一把梭:会打断正常业务,应先按 TYPE、ADDR 精确筛选再动手
  • 忽略输出缓冲:慢消费者不处理会让 omem 膨胀,最终被输出缓冲限制强断连接
  • 既不设 timeout 也不开 tcp-keepalive:僵尸连接长期占资源,出问题时缺少线索

数据来源与参考

  • Redis 官方文档:客户端连接开销
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌