解决io.lettuce.core.RedisCommandTimeoutException: Command timed out, mysql 访问15分钟阻塞等待

写这篇文章前我也是谷歌百度过,可以无非都是千篇一律配置 timeout 或者  lettuce的连接池,可是更改完这些配置,问题依旧,于是开始了自我探索之路,请出Wireshark大杀器,每当动用Wireshark时,我都知道我摊上大事了,文章是两个问题一个redis,一个mysql,但是都是一个原因造成的,所以写在了一起

一:redis超时

1.出现问题的现象是每隔5,6分钟(这个时间是反复观察测试出来结果),redis访问就会报lettuce超时错误,下一次重新访问就好了,所以从这个为突破点,本地用Wireshark监控发往服务器的数据包,

很明显服务器连接有问题,于是在服务器多次运行netstat -an |grep 6379命令,并没有发现服务器发现tcp主动关闭连接(没有time_wait标识),再次多次运行netstat -an |grep 本地连接redis端口,发现一会儿连接就突然没了,不符合逻辑,通过用tcpdump抓服务器的数据包,也没有发现明显的问题,那么连接到底怎么没的?

第二天早上想会不会是服务器自身问题,于是开始搜索 蓝云Azure  tcp断开问题,还真找到了

https://docs.microsoft.com/zh-cn/azure/load-balancer/load-balancer-tcp-reset,原来是这个原因

解决方法:

第一种:redis,mysql 配置文件写成服务器的内网ip即可,不走他的网关,缺点就是本地开发没办法用

第二种

lettuce换成jredis,因为通过用Wireshark发现jredis默认是发心跳包的,而lettuce是不发心跳包的,所以能骗过蓝云的网关,更改如下

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </exclusion>
        <exclusion>
            <artifactId>lettuce-core</artifactId>
            <groupId>io.lettuce</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!-- jedis客户端 -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<!-- spring2.X集成redis所需common-pool2,使用jedis必须依赖它-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

第三种:

自己写个定时器轮询访问redis,模拟一下心跳,其实这个方法也没什么不好,只是需要自己写代码

二:mysql 查询网关超时

同一个接口中redis问题解决了,又发现mysql有时访问一直阻塞,导致zulll网关超时,于是打印日志监控执行时间,发现mysql查询需要15分钟,并且没有报错,推测本质上应该也是这个tcp被意外断开了,由于项目只是使用了阿里的druid连接池,并没有进行配置,于是先尝试配置一下连接池,发现问题完美解决偶尔15分钟查询阻塞问题,以下是druid的配置

##### druid配置
#连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive
spring.datasource.druid.initial-size=10
spring.datasource.druid.max-active=100
spring.datasource.druid.min-idle=50
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
#打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
spring.datasource.druid.validation-query=SELECT 'x'
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.validation-query-timeout=5000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
#配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.filters=stat,wall
# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
#是否启用StatFilter默认值true
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions="*.js , *.gif ,*.jpg ,*.png ,*.css ,*.ico , /druid/*"
spring.datasource.druid.web-stat-filter.session-stat-max-count=1000
spring.datasource.druid.web-stat-filter.profile-enable=true
spring.datasource.druid.web-stat-filter.session-stat-enable=false
# StatViewServlet配置
#展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
#是否启用StatViewServlet默认值true
spring.datasource.druid.stat-view-servlet.enabled=false
#根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:http://127.0.0.1:9000/druid/index.html
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
#允许清空统计数据
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

 

  • 20
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这个错误表示在执行 Redis 命令时超时了。RedisCommandTimeoutExceptionLettuce 客户端库中的异常类,它指示 Redis 命令执行超时。 在默认情况下,Lettuce 客户端库设置了一个命令执行的超时时间,如果 Redis 服务器在该时间内没有返回结果,则会抛出这个异常。在你的情况下,命令执行时间超过了 100 秒。 有几个可能的原因导致命令执行超时: 1. Redis 服务器过载:如果 Redis 服务器处理大量请求或者数据量过大,可能导致命令执行时间增长。可以通过监控 Redis 服务器的负载情况来验证这一点。 2. 网络延迟:如果 Redis 服务器和 Lettuce 客户端之间的网络延迟增加,命令执行时间会增加。可以通过检查网络连接和延迟来排除这个问题。 3. 命令复杂性:某些复杂的 Redis 命令(如聚合操作或大规模数据操作)可能需要更长的执行时间。可以检查你正在执行的命令是否包含复杂操作。 为了解决这个问题,你可以尝试以下几个步骤: 1. 检查 Redis 服务器的性能和负载情况,确保它没有过载。 2. 检查网络连接和延迟,确保网络通畅。 3. 优化你的 Redis 命令,尽量减少复杂操作或者将其拆分成多个较小的操作。 4. 调整 Lettuce 客户端的命令执行超时时间,可以根据你的实际需求增加超时时间。 如果问题仍然存在,你可能需要进一步调查和诊断,可能需要检查日志以获取更多细节,或者考虑升级 Redis 服务器的硬件配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_令狐大侠_

觉的文章对你有用,鼓励一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值