首页/数据/Redis 进阶速查/timeout 回收空闲连接
性能与排障129 条

timeout 回收空闲连接

timeout 配置客户端空闲超过秒数后断开(默认 0 不回收);滥用会导致连接池频繁重建,通常交给客户端连接池管理。

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

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 影响;遇到「超时没生效」的情况,先看该连接的标志位与角色。

易错点

  • 超时值比连接池保活间隔还短:连接被反复断开重建,业务侧表现为周期性抖动
  • 把服务端超时当连接治理主手段:掩盖了泄漏根因,问题会在高峰期以更严重的形式出现
  • 忽略中间代理的超时:多层超时叠加后实际断开时间与预期不符,排查方向被带偏
  • 调小保活间隔却不评估开销:高连接数下探测流量与唤醒次数都是成本
  • 改完不看指标:应同步观察连接总数与错误率,确认没有引入新的重连压力

数据来源与参考

  • Redis 官方文档:timeout 配置
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌