Springboot连接Redis超时问题解决

1.Jedis:
Jedis是同步的,不支持异步,Jedis客户端实例不是线程安全的,需要每个线程一个Jedis实例,所以一般通过连接池来使用Jedis.

优点:

提供了比较全面的 Redis 操作特性的 API
API 基本与 Redis 的指令一一对应,使用简单易理解
缺点:

同步阻塞 IO
不支持异步
线程不安全

2.Lettuce:
Lettuce是基于Netty框架的事件驱动的Redis客户端,其方法调用是异步的,Lettuce的API也是线程安全的,所以多个线程可以操作单个Lettuce连接来完成各种操作,同时Lettuce也支持连接池.

优点:

线程安全
基于 Netty 框架的事件驱动的通信,可异步调用
适用于分布式缓存
缺点:

API 更抽象,学习使用成本高

一、问题出现
在使用SpringBoot整合Redis作为缓存时,一段时间不去操作,再次刷新会出现连接超时的问题,如下:
io.lettuce.core.RedisCommandTimeoutException: Command timed out after 5 second(s)

Redis command timed out; nested exception is io.lettuce.core.RedisCommandTim

二、原因
springboot 2.x 默认采用了lettuce作为连接池,但是lettuce是不会进行“心跳”操作的,也就是说,它不会保持连接,导致了连接超时。

三、解决
我们可以将连接池修改为jedis,jedis是会有“心跳”的。
在pom.xml排除lettuce,并修改为jedis


    org.springframework.boot
    spring-boot-starter-data-redis
    
        
            redis.clients
            jedis
        
        
            lettuce-core
            io.lettuce
        
    


    redis.clients
    jedis


    org.apache.commons
    commons-pool2

yml配置

spring:
# redis配置
redis:
  # 地址
  host: 39.99.153.145
  # 端口,默认为6379
  port: 6379
  # 数据库索引
  database: 0
  # 密码
  password: 
  # 连接超时时间
  timeout: 10s
  jedis:
    pool:
      # 连接池中的最小空闲连接
      min-idle: 0
      # 连接池中的最大空闲连接
      max-idle: 8
      # 连接池的最大数据库连接数
      max-active: 8
      # #连接池最大阻塞等待时间(使用负值表示没有限制)
      max-wait: -1ms

你可能感兴趣的:(spring,boot,redis,后端)