Redis系列---【解决redis连接后,隔一段时间,连接慢的问题】
1.问题
我用的springboot2.2.11连接redis7,发现每隔一段时间,redis就会出现lectture强制关闭远程连接。
2.产生这种问题的原因
1、Lettuce 自适应拓扑刷新(Adaptive updates)与定时拓扑刷新(Periodic updates) 是默认关闭的。
2、项目用了k8s做docker容器化部署,但是k8s有设置空闲连接超时就断开,所以当你从连接池拿到被断开的连接时就会报错。
3.解决方案
方案一
@Bean public RedisTemplatemyRedisTemplate(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。