Redis系列---【解决redis连接后,隔一段时间,连接慢的问题】


1.问题

  我用的springboot2.2.11连接redis7,发现每隔一段时间,redis就会出现lectture强制关闭远程连接。

2.产生这种问题的原因

  1、Lettuce 自适应拓扑刷新(Adaptive updates)与定时拓扑刷新(Periodic updates) 是默认关闭的。
  2、项目用了k8s做docker容器化部署,但是k8s有设置空闲连接超时就断开,所以当你从连接池拿到被断开的连接时就会报错。

3.解决方案

方案一

@Bean
    public RedisTemplate myRedisTemplate(LettuceConnectionFactory factory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        //解决redis每隔一段时间强制关闭远程连接的问题
        factory.setValidateConnection(true);
        redisTemplate.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        // 设置 Key 和 Value 的序列化规则
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        // 初始化 RedisTemplate 序列化完成
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

方案二

springboot2.3以上版本,可添加配置解决。

# 解决redis 240秒超时问题
    lettuce:
      cluster:
        refresh:
          adaptive: true
          period: 20

方案三

排除lettuce,采用jedis。

         <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redisartifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.lettucegroupId>
                    <artifactId>lettuce-coreartifactId>
                exclusion>
            exclusions>
        dependency>
        
        <dependency>
            <groupId>redis.clientsgroupId>
            <artifactId>jedisartifactId>
        dependency>    

注意配置文件把lettuce.pool换成jedis.pool。