it编程 > 数据库 > Redis

Redis连接断开后实现自动重连的操作过程

97人参与 • 2026-09-30 • Redis

1 日志解析

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

[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 的正常容错机制,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 配置:

redis-cli config get timeout

2.2 网络问题

2.3 redis 重启或故障转移

2.4 客户端资源回收

3 如何避免频繁重连?

在 spring boot 中,可以通过 启用 tcp keepalive 和 lettuce 心跳 来保持连接活跃。

方法 1:配置application.yml

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 连接配置

@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 和合理的连接池参数,避免因中间网络设备超时导致连接断开。

到此这篇关于redis连接断开后实现自动重连的操作过程的文章就介绍到这了,更多相关redis连接断开后自动重连内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

赞 (0)

您想发表意见!!点此发布评论

推荐阅读

Redis 持久化与事务:RDB、AOF、MULTI/EXEC 与 WATCH 全解析

09-30

Redis持久化与事务机制原理、配置与避坑指南

09-30

Nginx+Lua+Redis实现动态封禁IP的几种方法

09-30

在Ubuntu上安装和使用Composer流程步骤

09-30

Redis 多机房同步实现主从跨地域复制延迟与数据一致性

10-01

Redis Cluster 高可用集群部署方案详解

09-29

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论