redis使用lettuce客户端超时异常采坑
不多说直接上图:
这就是项目在线上的日志,查了大量日志也没发现有啥规律,时不时就会报这个错,然后下次一访问又正常了,查了很多资料也没找到为什么lettuce会出现这个问题!
解决方法:
直接把lettuce驱动换成jedis,亲测确实有效!
<!-- redis start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- lettuce pool 缓存连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.10.2</version>
</dependency>
配置文件改动:
spring.redis.jedis.pool.max-idle=200
spring.redis.jedis.pool.min-idle=100
spring.redis.jedis.pool.max-active=200
spring.redis.jedis.pool.max-wait=1000
spring-data-redis内置了两款驱动,jedis和lettuce。springboot1.X版本默认jedis实现,springboot2.X默认lettuce实现。
lettuce:基于netty实现,线程安全,但默认只有一个实例。
jedis:直连redis服务端,一般配合连接池使用,可以增加物理连接。
至于lettuce的问题,试了很多方法(增大time-out超时时间不管设置的多大,只要断掉连接就不会重连),至于很多大佬说的Lettuce版本问题或者是服务器本身负载均衡器 TCP 重置导致断掉连接也没找到具体证据(有大牛知道原因的欢迎指正)。
关联问题
这个问题,单纯从一些线上并发不高交互性简单的活动来说也没那么重要,至多会影响用户体验,以至于测试之前也没测试出这个问题,但是你如果用redis作为分布式锁,这就是个非常致命的问题,超时就会直接导致分布式锁获取失败,一系列的关联问题(都是泪的经验,捞日志就捞到吐),引以为戒吧,说的不对的欢迎指正!
转载自:https://juejin.cn/post/6899269022278238222