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检测到与 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 配置:
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
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 其他建议
- 检查 redis 服务器负载:是否因 oom、cpu 打满导致连接断开?
- 查看 redis 日志:是否有
client closed connection或timeout相关记录? - 监控连接数:
redis-cli info clients查看connected_clients是否突增突降。 - 云厂商注意:云 redis 实例通常有 连接空闲超时策略,建议设置
keep-alive。
5 总结
| 问题 | 结论 |
|---|---|
| 这是 bug 吗? | 不是,是 lettuce 正常重连机制 |
| 需要处理吗? | 建议排查断连原因 + 启用 keep-alive 避免频繁重连 |
| 影响业务吗? | 如果重连很快(毫秒级),通常无感知;但频繁重连可能影响性能 |
生产务必配置 tcp keep-alive 和合理的连接池参数,避免因中间网络设备超时导致连接断开。
到此这篇关于redis连接断开后实现自动重连的操作过程的文章就介绍到这了,更多相关redis连接断开后自动重连内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论