Redis 连接断开后的自动重连操作

1 日志解析

这不是 bug,而是Lettuce在进行 Redis 连接断开后的自动重连操作。

bash 复制代码
[2025-12-18 17:45:46:088] ... INFO ... Reconnecting, last destination was 140.x.x.x/140.x.x.x:56750
[2025-12-18 17:45:46:095] ... INFO ... Reconnected to 140.x.x.x:56750
  • Lettuce 检测到与 Redis 的连接断开了
  • 自动尝试重新连接(Reconnecting)
  • 成功重新建立连接(Reconnected)

整个过程是 Lettuce 的正常容错机制,Lettuce 的 ConnectionWatchdog 就每 5 分钟重连一次,这是 INFO 级别 、心跳空闲超时(timeout: 300)后的正常重连,不是 ERROR。真正隐患是它每 5 分钟准时出现,说明连接一直处于"连上→空闲断开→重连"的循环。

我的场景是因为 服务器应用连的 db2,那里空空如也 。应用启动时把 Redis 写入链路关了(v2x.process.enabled: false),又对着空库操作,Lettuce 的 ConnectionWatchdog 就每 5 分钟重连一次,刷那串 INFO 日志。

2 为啥会断开连接?

虽重连成功,但也应排查 为什么连接会断开。常见原因:

2.1 Redis 服务端主动断开

Redis 配置了 timeout(空闲连接超时),默认是 0(不超时),但如果设为比如 300(秒),空闲连接会被关闭。

检查 Redis 配置:

bash 复制代码
redis-cli CONFIG GET timeout

2.2 网络问题

  • 中间有防火墙、NAT、负载均衡器(如云厂商 SLB)设置了 TCP 空闲超时(例如阿里云 SLB 默认 900 秒)。
  • 如果客户端和 Redis 之间长时间无通信,中间设备会断开 TCP 连接。

2.3 Redis 重启或故障转移

  • Redis 实例重启、主从切换、哨兵切换等会导致连接中断。

2.4 客户端资源回收

  • 应用长时间未使用 Redis 连接,连接池可能被清理(但 Lettuce 默认是长连接,不太可能)。

3 如何避免频繁重连?

在 Spring Boot 中,可以通过 启用 TCP Keepalive 和 Lettuce 心跳 来保持连接活跃。

方法 1:配置 application.yml
yaml 复制代码
spring:
  redis:
    host: 140.x.x.x
    port: xxx
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
      # 启用连接健康检查(可选)
      shutdown-timeout: 100ms
    # 启用 TCP keep-alive
    client-name: my-app

⚠️ 注意:spring.redis.lettuce 不直接支持 keep-alive,需要通过 自定义 LettuceClientConfiguration。

方法 2:(推荐)自定义 Lettuce 连接配置
java 复制代码
@Configuration
public class RedisConfig {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        // 启用 TCP keep-alive 和连接健康检查
        SocketOptions socketOptions = SocketOptions.builder()
                .keepAlive(true)          // 启用 TCP keep-alive
                .tcpNoDelay(true)
                .build();

        ClientOptions clientOptions = ClientOptions.builder()
                .socketOptions(socketOptions)
                .build();

        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .clientOptions(clientOptions)
                .build();

        return new LettuceConnectionFactory(redisStandaloneConfiguration(), clientConfig);
    }

    // 你的 Redis 配置(host/port)
    private RedisStandaloneConfiguration redisStandaloneConfiguration() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        config.setHostName("140.x.x.x");
        config.setPort(56750);
        return config;
    }
}

4 其他建议

  1. 检查 Redis 服务器负载:是否因 OOM、CPU 打满导致连接断开?
  2. 查看 Redis 日志 :是否有 Client closed connection 或 Timeout 相关记录?
  3. 监控连接数 :redis-cli info clients 查看 connected_clients 是否突增突降。
  4. 云厂商注意 :云 Redis 实例通常有 连接空闲超时策略 ,建议设置 keep-alive。

5 总结

问题 结论
这是 bug 吗? 不是,是 Lettuce 正常重连机制
需要处理吗? 建议排查断连原因 + 启用 keep-alive 避免频繁重连
影响业务吗? 如果重连很快(毫秒级),通常无感知;但频繁重连可能影响性能

生产务必配置 TCP keep-alive 和合理的连接池参数,避免因中间网络设备超时导致连接断开。

相关推荐
Rain的Java大神之路9 小时前
百万并发直播弹幕系统设计全解:看懂了扇出,你就看懂了高并发的八成
java·后端·面试
山间小僧9 小时前
Agent Memory(三)团队记忆:以 TencentDB Agent Memory 为例
后端·agent
十年Java程序媛9 小时前
JVM 基础与 GC 垃圾回收详解|可达性分析、分代模型、垃圾收集器、STW
java·开发语言·jvm·spring boot·后端·面试
苏三说技术9 小时前
为什么越来越多人用MinerU?
后端
2301_32241428049 小时前
基于SSM框架的在线考试管理系统的设计与实现14750-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·redis·mysql·tomcat·maven·mybatis·ssm
SimonKing9 小时前
别再找笔记了,试试这款轻量级的开源软件:local-notes
后端·程序员·开源
狂师9 小时前
太强了!GitHub上开源了一款AI自动化测试框架,0代码搞定前后端测试!
前端·后端·测试
我星期八休息9 小时前
Redis 的原理和使用(2)
前端·数据库·redis·python·mysql·缓存·bootstrap
张张123y9 小时前
后端第十三课:大模型评测(Evals)从 0 到 1——看完面试能讲明白
后端·面试·职场和发展·大模型评测·evals
她的男孩10 小时前
JAR 全对仍 checksum mismatch:Forge Admin 把 Flyway 从 filesystem 改成 classpath
java·数据库·spring boot