=>>漫反射=>> 2024-06-10 22:38 采纳率: 50%
浏览 361

关于redis客户端lettuce连接被服务器端关闭而造成连接重置导致操作失败的问题

最近在学习一个spring boot项目,其中有用到redis,正好有个腾讯云服务器闲着,练习这个项目的时候,就用云服务器使用docker部署了mysql和redis。

因为是学习项目,所以边学边操作,很多时候会比较长时间无操作,这种情况时,再操作,就会发现连接被关闭或者重置。

当报了这个异常以后,立刻再操作就可以了,因为lettuce尝试了重连,但是本次操作失败了,我也想过可以用try catch再操作一次,但是当前操作失败也要等待几秒延迟,这也是不能接受的。

查了不少资料,也问了AI,关于lettuce的心跳检测和保活配置都是假的,复制代码到IDEA中就会发现,压根没有AI中回答的配置方法。
当然,通过定时任务来操作redis保活,和换用jedis这样的方式都是查资料可查的内容。这个问题是想知道是否有不知道的配置和用法等可以解决这个问题。

异常信息中比较关键的如下:
org.springframework.data.redis.RedisSystemException: Redis exception
Caused by: io.lettuce.core.RedisException: java.net.SocketException: Connection reset
Caused by: java.net.SocketException: Connection reset

另:现在云服务器都这么狗的吗,长连接自动给断?

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-10 22:38
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的问题描述,您在使用Spring Boot项目中的Redis客户端lettuce时遇到了连接被服务器端关闭导致操作失败的问题。您希望找到一种方法来解决长时间无操作后Redis连接被重置的问题,同时避免使用try-catch机制导致的操作延迟。

    首先,我们可以从搜索结果中找到一些可能的解决方案:

    1. Spring Boot 2.3以上版本的配置:如果您使用的是Spring Boot 2.3或更高版本,可以通过添加特定的配置来解决lettuce连接池的问题[^1^]。
    2. 排除lettuce,采用jedis:如果lettuce的问题无法通过配置解决,您可以考虑排除lettuce,转而使用jedis作为Redis客户端[^1^]。
    3. 设置Linux的TCP参数:针对lettuce连接超时问题,可以通过设置Linux的TCP参数来缩短等待时间,例如设置TCP_RETRIES2参数[^3^]。
    4. 设置Socket Option的TCP_USER_TIMEOUT参数:可以在Spring Boot的auto-configuration中自定义ClientResources,并通过NettyCustomizer设置TCP_USER_TIMEOUT参数来改善连接超时问题[^3^]。
    5. 开启lettuce的连接校验:lettuce提供了校验连接的方法,可以通过开启该功能来定时校验连接,从而避免长时间无操作导致的连接重置问题[^4^]。

    针对云服务器自动断开长连接的行为,这通常是由于服务器的安全设置或资源管理策略导致的。例如,SSH服务的配置文件sshd_config中可能设置了连接超时参数,您可以通过调整这些参数来保持SSH会话持续连接不断开[^7^][^8^][^9^]。

    综上所述,您可以尝试以下几种方法来解决您遇到的问题:

    • 升级Spring Boot版本并添加相应的配置。
    • 考虑使用jedis替代lettuce。
    • 调整Linux系统的TCP参数,例如TCP_RETRIES2TCP_USER_TIMEOUT
    • 开启lettuce的连接校验功能。
    • 如果问题出现在SSH连接上,调整sshd_config文件中的ClientAliveIntervalClientAliveCountMax参数。

    希望这些建议能够帮助您解决问题。如果您需要更详细的代码实现或配置方法,可以参考上述提到的资料链接。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月10日