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。