redis使用lettuce客户端超时异常采坑

9,232 阅读1分钟

不多说直接上图: 这就是项目在线上的日志,查了大量日志也没发现有啥规律,时不时就会报这个错,然后下次一访问又正常了,查了很多资料也没找到为什么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作为分布式锁,这就是个非常致命的问题,超时就会直接导致分布式锁获取失败,一系列的关联问题(都是泪的经验,捞日志就捞到吐),引以为戒吧,说的不对的欢迎指正!