1.问题
我用的springboot2.2.11连接redis7,发现每隔一段时间,redis就会出现lectture强制关闭远程连接。
2.产生这种问题的原因
1、Lettuce 自适应拓扑刷新(Adaptive updates)与定时拓扑刷新(Periodic updates) 是默认关闭的。
2、项目用了k8s做docker容器化部署,但是k8s有设置空闲连接超时就断开,所以当你从连接池拿到被断开的连接时就会报错。
3.解决方案
方案一
@Bean public RedisTemplate<String, Object> myRedisTemplate(LettuceConnectionFactory factory) { RedisTemplate<String, Object> 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.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
注意配置文件把lettuce.pool换成jedis.pool。