SpringBoot集成Redis后,运行一段时间后发现RedisCommandTimeoutException

背景:

在项目中引入SpringBoot的autoConfig来管理组件,在集成redis后到沙箱环境运行一段时间后,发现客户端连接redis就会出现超时。

现象:

每次调用redis执行命令的时候会出现下面这个报错:

Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 1 minute(s)
at io.lettuce.core.ExceptionFactory.createTimeoutException(ExceptionFactory.java:51) ~[lettuce-core-5.1.6.RELEASE.jar!/:?]
at io.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:114) ~[lettuce-core-5.1.6.RELEASE.jar!/:?]
at io.lettuce.core.FutureSyncInvocationHandler.handleInvocation(FutureSyncInvocationHandler.java:69) ~[lettuce-core-5.1.6.RELEASE.jar!/:?]
at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80) ~[lettuce-core-5.1.6.RELEASE.jar!/:?]
at com.sun.proxy.$Proxy143.get(Unknown Source) ~[?:?]
at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.get(LettuceStringCommands.java:66) ~[spring-data-redis-2.1.8.RELEASE.jar!/:2.1.8.RELEASE]
at org.springframework.data.redis.connection.DefaultedRedisConnection.get(DefaultedRedisConnection.java:253) ~[spring-data-redis-2.1.8.RELEASE.jar!/:2.1.8.RELEASE]
at org.springframework.data.redis.connection.DefaultStringRedisConnection.get(DefaultStringRedisConnection.java:377) ~[spring-data-redis-2.1.8.RELEASE.jar!/:2.1.8.RELEASE]
at org.springframework.data.redis.core.DefaultValueOperations$1.inRedis(DefaultValueOperations.java:57) ~[spring-data-redis-2.1.8.RELEASE.jar!/:2.1.8.RELEASE]
at org.springframework.data.redis.core.AbstractOperations$ValueDeserializingRedisCallback.doInRedis(AbstractOperations.java:59) ~[spring-data-redis-2.1.8.RELEASE.jar!/:2.1.8.RELEASE]
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:224) ~[spring-data-redis-2.1.8.RELEASE.jar!/:2.1.8.RELEASE]
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:184) ~[spring-data-redis-2.1.8.RELEASE.jar!/:2.1.8.RELEASE]
at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:95) ~[spring-data-redis-2.1.8.RELEASE.jar!/:2.1.8.RELEASE]
at org.springframework.data.redis.core.DefaultValueOperations.get(DefaultValueOperations.java:53) ~[spring-data-redis-2.1.8.RELEASE.jar!/:2.1.8.RELEASE]
at com.anjuke.api.comboplus.scf.util.RedisUtil.get(RedisUtil.java:28) ~[classes!/:?]
at com.anjuke.api.comboplus.scf.impl.inner.BackWordServiceImpl.flushHouseRedis(BackWordServiceImpl.java:35) ~[classes!/:?]
... 10 more

排查

通过上面的报错,发现是redis超时导致的

于是,执行ping redis域名,发现是正常的。担心是不是端口有问题导致的,telnet 域名 端口,发现端口也是通的。这就很奇怪了。于是开始审视自己的代码,发现了一个不正常的情况:

下面是redis的配置

spring:
  redis:
    host: redis域名
    port: 端口
    password: password
    jedis:
      pool:
        max-active: 16
        max-wait: 5000
        max-idle: 8
        min-idle: 2

发现我配置的是jedis的客户端,但是springBoot加载的redis客户端是lettuce客户端,就怀疑是不是springboot自动注入,加载的redis客户端是不是顺序乱了导致的。

于是,去看了springboot关于redis客户端的自动注入实现:

发现springBoot在自动注入的时候会优先加载lettuce的连接工厂,这就发现配置中的配置没有发挥作用。

排查到此,也有了怀疑,为啥lettuce默认的配置会导致redis出现超时呢?于是在同事的建议下到lettuce的GitHub工程里面,看了下,lettuce是有这个bug的。看了下,发现可能是由于io底层与云平台不兼容导致,然后redis底层容器中的连接没有了,调用的时候再去拿去连接,无法生成连接,然后,由于maxWait默认值是-1(永久等待)。所以执行的时候导致超时。

具体的ISSUE地址:https://github.com/lettuce-io/lettuce-core/issues

当然以上只是推测,没有去验证,后面有空了,去验证下是不是上述的原因。

解决

把springBoot中lettuce-core的jarexclude掉。让SpringBoot使用jedis去加载它。

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在Spring Boot中集成Redis可以通过以下步骤实现: 1. 引入spring-boot-starter-data-redis依赖。在项目的pom.xml文件中,添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 这将自动引入与Redis集成所需的依赖项。 2. 在Spring Boot的核心配置文件application.properties中配置Redis连接信息。在该文件中添加以下配置项: ``` spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password=123456 ``` 根据你的实际情况,将host、port和password替换为相应的值。这些配置将用于建立与Redis服务器的连接。 通过以上步骤,你就成功地在Spring Boot应用程序中集成Redis。现在,你可以使用Spring Data Redis的API来访问和操作Redis数据库。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringBoot集成redis](https://blog.csdn.net/qq_43512320/article/details/122684865)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [springboot集成Redis](https://blog.csdn.net/m0_54853420/article/details/126515971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值