说到Redis使用Lettuce作为数据源使用的时候,在之前的文章中已经介绍过,当Redis的服务端出现故障迁移后,Lettuce客户端一直无法感知节点变化导致无法连接Redis服务器的问题,相关内容:https://blog.csdn.net/ankeway/article/details/100136675,这个兼容方案需要自己来实现。
这次Spring Boot 2.3.0开始,官方开启了这个新特性。
只要开启 spring.redis.lettuce.cluster.refresh.adaptive.enabled 拓扑刷新。org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration 这个类中增加了关于节点刷新相关的属性配置。
private ClientOptions.Builder initializeClientOptionsBuilder() {
if (getProperties().getCluster() != null) {
ClusterClientOptions.Builder builder = ClusterClientOptions.builder();
Refresh refreshProperties = getProperties().getLettuce().getCluster().getRefresh();
Builder refreshBuilder = ClusterTopologyRefreshOptions.builder();
if (refreshProperties.getPeriod() != null) {
refreshBuilder.enablePeriodicRefresh(refreshProperties.getPeriod());
}
if (refreshProperties.isAdaptive()) {
refreshBuilder.enableAllAdaptiveRefreshTriggers();
}
return builder.topologyRefreshOptions(refreshBuilder.build());
}
return ClientOptions.builder();
}
org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration.getLettuceClientConfiguration(ObjectProvider<LettuceClientConfigurationBuilderCustomizer>, ClientResources, Pool) 这个方法中,比老版本多了一行
builder.clientOptions(initializeClientOptionsBuilder().timeoutOptions(TimeoutOptions.enabled()).build());
主要是多了org.springframework.boot.autoconfigure.data.redis.RedisProperties.Lettuce.Cluster.Refresh,2个属性配置,
public static class Cluster {
private final Refresh refresh = new Refresh();
public Refresh getRefresh() {
return this.refresh;
}
public static class Refresh {
/**
* Cluster topology refresh period.
*/
private Duration period;
/**
* Whether adaptive topology refreshing using all available refresh
* triggers should be used.
*/
private boolean adaptive;
public Duration getPeriod() {
return this.period;
}
public void setPeriod(Duration period) {
this.period = period;
}
public boolean isAdaptive() {
return this.adaptive;
}
public void setAdaptive(boolean adaptive) {
this.adaptive = adaptive;
}
}
}
}
一个是刷新的频率,一个是是否开启自适应刷新,自适应拓扑刷新是否使用所有可用的更新。
spring:
redis:
lettuce:
pool:
max-active: ${redis.config.maxTotal}
max-idle: ${redis.config.maxIdle}
min-idle: ${redis.config.minIdle}
max-wait: ${redis.config.maxWaitMillis}
cluster:
refresh:
adaptive: true
period: 30000
同时为了避免使用新版本后不走官方设置,老的兼容方案中可以增加一个条件配置,
@ConditionalOnProperty(name = "spring.redis.lettuce.cluster.refresh.adaptive.enabled", havingValue = "false")
public LettuceConnectionFactory lettuceConnectionFactory() {
..............
}
这样就更加灵活了