timeout 回收空闲连接
timeout 让 Redis 在客户端空闲超过指定秒数后主动断开连接,默认 0 表示不断开。它是兜底手段而不是主手段:连接治理应该优先在客户端连接池侧做空闲回收与健康检查。服务端一刀切断连,最典型的副作用是连接池被迫反复重建连接,业务侧表现为周期性抖动。
基本信息
| 配置项 | timeout |
|---|---|
| 默认值 | 0,即不主动断开空闲连接 |
| 生效范围 | 普通客户端;复制连接、订阅客户端、阻塞中的连接不受影响 |
| 调整方式 | CONFIG SET timeout N,运行时生效 |
| 易混淆项 | tcp-keepalive(保活探测,默认 300 秒) |
| 观测 | CLIENT LIST 的 idle 列、INFO stats 的连接计数 |
典型使用场景
- 清理僵尸连接:确实存在泄漏又改不动客户端时,用服务端超时兜底
- 短连接规范化:先上连接池,再考虑用超时作为第二道防线
- 排查重连风暴:连接周期性断开重建时,检查超时值与保活间隔的关系
- 多层代理环境:确认四层代理与 Redis 的超时值不会互相打架
- 变更验证:开启超时后观察连接池错误率与重连次数是否上升
最小示例
最小示例
redis-cli CONFIG GET timeout # 当前超时设置
redis-cli CONFIG GET tcp-keepalive # 保活探测间隔
redis-cli CLIENT LIST | grep -E 'idle=[0-9]{3,}' # 现存的高空闲连接
redis-cli INFO stats | grep total_connections_received # 连接总数增长是否异常
redis-cli CONFIG SET timeout 0 # 保守做法:交回客户端治理设置对照
| 设置 | 行为 | 风险 |
|---|---|---|
| timeout 为 0 | 空闲连接不断开 | 僵尸连接长期占用内存与句柄 |
| timeout 大于连接池保活间隔 | 连接池先做健康检查,连接被复用 | 依赖客户端侧实现质量 |
| timeout 小于连接池保活间隔 | 服务端先断开,客户端被动重连 | 周期性抖动与重连风暴 |
| tcp-keepalive 调小 | 更快发现对端失联 | 高连接数下探测包本身也有开销 |
timeout 与 tcp-keepalive 职责不同:前者按业务空闲时间断开,后者用探测包判断对端是否存活。两者都不负责解决连接泄漏本身。
复制连接、订阅客户端与阻塞中的连接不受 timeout 影响;遇到「超时没生效」的情况,先看该连接的标志位与角色。