返回首页

Redis 连接管理与熔断治理 — 连接数打满 / 僵尸连接 / 雪崩防护

📅 创建于 2026-05-11 🔄 更新于 2026-05-11 📝 410 字

Redis 连接管理与熔断治理

Redis 连接数打满往往不是单一原因,而是连接池配置不当 + timeout=0 + 缺少熔断机制 三个因素叠加的结果。核心教训:timeout=0 在生产环境是高风险配置。

连接机制

Redis 单线程事件循环,每个客户端占用一个 fd。

配置项 默认值 说明
maxclients 10000 最大连接数,受 fd 限制约束
timeout 0 连接空闲超时,0=永不超时(生产高风险)
tcp-keepalive 300 TCP keepalive 间隔(秒)

maxclients 必须联动调整: Redis 配置 → ulimit → fs.file-max → limits.conf,缺一不可。

排查命令速查

# 连接概况
redis-cli INFO clients                           # connected_clients / maxclients

# 连接分布
redis-cli CLIENT LIST | awk '{print $2}' | cut -d= -f2 | cut -d: -f1 \
  | sort | uniq -c | sort -rn | head -10        # 各 IP 连接数

# 僵尸连接(idle 过大)
redis-cli CLIENT LIST | grep -E "idle=[0-9]{4,}"

# 系统限制检查
cat /proc/$(pidof redis-server)/limits | grep "Max open files"
cat /proc/sys/fs/file-nr

快速止血

操作 命令 注意事项
增大上限 CONFIG SET maxclients 20000 必须同时调大 ulimit/fs.file-max
启用超时 CONFIG SET timeout 60 不要在高峰期从 0 改小值(批量断连冲击)
批量杀连接 CLIENT KILL TYPE normal 保留主从复制连接
按 IP 杀 CLIENT KILL addr 10.0.1.12:0 跳过当前连接(默认 skipme=yes)

连接池配置

<!-- Jedis Pool 生产推荐 -->
<property name="maxTotal" value="50"/>         <!-- 单节点 20~100 -->
<property name="maxIdle" value="20"/>
<property name="minIdle" value="5"/>           <!-- 新版本发布时 minIdle 翻倍 -->
<property name="maxWaitMillis" value="2000"/>  <!-- 必须设,防无限等待 -->
<property name="testWhileIdle" value="true"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>

关键原则:

  • maxTotal 不是越大越好。Redis 处理 10000 个空闲连接 vs 500 个活跃连接的开销完全不同
  • 设 maxWaitMillis(建议 1000~3000ms),避免线程无限等待
  • 用 try-with-resources(Jedis 3.x+)或 finally 确保连接归还
  • 发布过程中监控连接数变化,发现异常立即回滚

熔断与降级

// 指数退避重试
int baseDelay = 100;
for (int i = 0; i < maxRetries; i++) {
    try { return jedisPool.getResource(); }
    catch (Exception e) { Thread.sleep(baseDelay * (long)Math.pow(2, i)); }
}

应用侧必须有熔断机制。否则单一组件故障级联扩散形成雪崩。

雪崩链路

连接满 → 获取连接失败 → 无熔断 → 重试阻塞线程
→ 线程池打满 → 健康检查超时 → 注册中心摘除节点
→ 流量转移 → 剩余节点也打满 → 全面不可用

注册中心选型对比参见 [[registry-center-comparison]](Nacos/ZK/Consul 深度对比)。

连接代理收敛

大规模直连:应用 × 50 个 → Redis         (M × N 连接)
代理收敛:  应用 × 50 个 → 代理 → Redis  (M + N 连接)

推荐:Twemproxy / Predixy。增加 0.1~0.5ms 延迟,但显著降低连接数。

监控告警

# Prometheus
redis_connected_clients / redis_config_maxclients
# > 80% Warning | > 90% Critical | rejected_connections > 0 → P0 Emergency

关联页面

页面 关联点
redis-persistence-strategy Redis 持久化机制(RDB/AOF/混合)
redis-backup-recovery Redis 备份恢复与容灾
redis-ha-replication-sentinel Redis 高可用(主从复制/哨兵/脑裂)
redis-memory-optimization Redis 内存优化(客户端输出缓冲区 + 大响应排查)
server-performance-four-dimensions 系统级 fd/memory 监控
k8s-resource-limits-configuration 容器资源限制,OOM/连接相关