关于SpringBoot2.3.0版本开始Lettuce支持集群拓扑动态感应刷新的新特性说明

5 篇文章 0 订阅
5 篇文章 0 订阅

说到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() {
        ..............
    }

这样就更加灵活了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值