SpringBoot 2.xでデフォルトで使用されるRedisクライアントはJedisからLettuceに変更されましたが、Redisクラスター内のノードがハングダウンすると、Lettuceは引き続きRedisを操作できなくなります。これは、Lettuceが引き続き問題のある接続情報を使用するためです。今回は。
実際、Lettuceはredisクラスタートポロジの動的更新をサポートしていますが、デフォルトではオンになっておらず、Lettuceを統合するときにSpringBootはデフォルトでオンになりません。また、SpringBoot 2.3.0より前は、トポロジを自動的に更新するようにLettuceを設定するための構成項目はありませんでした。
関連する問題:Redisクラスタートポロジの更新を有効にするための構成を追加します
解決策1:解決策1:
- SpringBoot2.3.0以降にアップグレードします。そして、以下の構成項目を追加します
spring.redis.timeout=60s
spring.redis.lettuce.cluster.refresh.period=60s
spring.redis.lettuce.cluster.refresh.adaptive=true
解決策2:
LettuceConnectionFactoryを構成し、トポロジー更新戦略を設定します。
@Bean
public DefaultClientResources lettuceClientResources() {
return DefaultClientResources.create();
}
@Bean
public LettuceConnectionFactory lettuceConnectionFactory(RedisProperties redisProperties, ClientResources clientResources) {
ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
.enablePeriodicRefresh(Duration.ofSeconds(30)) //按照周期刷新拓扑
.enableAllAdaptiveRefreshTriggers() //根据事件刷新拓扑
.build();
ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()
//redis命令超时时间,超时后才会使用新的拓扑信息重新建立连接
.timeoutOptions(TimeoutOptions.enabled(Duration.ofSeconds(10)))
.topologyRefreshOptions(topologyRefreshOptions)
.build();
LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder()
.clientResources(clientResources)
.clientOptions(clusterClientOptions)
.build();
RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration(redisProperties.getCluster().getNodes());
clusterConfig.setMaxRedirects(redisProperties.getCluster().getMaxRedirects());
clusterConfig.setPassword(RedisPassword.of(redisProperties.getPassword()));
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(clusterConfig, clientConfiguration);
return lettuceConnectionFactory;
}
解決策3:解決策3:
- spring-boot-starter-data-redisが依存するレタスをジェダイに変更します。
<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>