长兴县住房建设局网站,wordpress 知识共享,WordPress空间换到万网,网站开发工资一般多少钱一 lettuce使用问题
1 问题描述
Redis Cluster集群#xff0c;当master宕机#xff0c;主从切换#xff0c;客户端报错 timed out
2 原因
SpringBoot2.X版本开始Redis默认的连接池都是采用的Lettuce。当节点发生改变后#xff0c;Letture默认是不会刷新节点拓扑的。
3…一 lettuce使用问题
1 问题描述
Redis Cluster集群当master宕机主从切换客户端报错 timed out
2 原因
SpringBoot2.X版本开始Redis默认的连接池都是采用的Lettuce。当节点发生改变后Letture默认是不会刷新节点拓扑的。
3 解决方案
3.1 方案一把lettuce换成jedis
推荐版本jedis 2.9 只需要在pom.xml里调整一下依赖的引用 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdversion2.1.5.RELEASE/version!-- 不用lettuce ,用jedis --exclusionsexclusiongroupIdio.lettuce/groupIdartifactIdlettuce-core/artifactId/exclusion/exclusions/dependencydependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion3.1.0-m4/version/dependency3.2 方案二刷新节点拓扑视图
Redis节点异常服务端的Redis集群拓扑被刷新了Java程序没有获取到新的拓扑。 Lettuce官方文档中关于Redis Cluster的相关说明Lettuce处理Moved和Ask永久重定向由于命令重定向你必须刷新节点拓扑视图。而自适应拓扑刷新Adaptive updates与定时拓扑刷新Periodic updates是默认关闭的可以通过如下代码打开。 https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster#user-content-refreshing-the-cluster-topology-view
修改代码如下
package com.montnets.common.redis;import io.lettuce.core.ClientOptions;
import io.lettuce.core.cluster.ClusterClientOptions;
import io.lettuce.core.cluster.ClusterTopologyRefreshOptions;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.stereotype.Component;import java.time.Duration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;Component
public class RedisPoolConfig {Autowiredprivate RedisProperties redisProperties;public GenericObjectPoolConfig? genericObjectPoolConfig(RedisProperties.Pool properties) {GenericObjectPoolConfig? config new GenericObjectPoolConfig();config.setMaxTotal(properties.getMaxActive());config.setMaxIdle(properties.getMaxIdle());config.setMinIdle(properties.getMinIdle());if (properties.getTimeBetweenEvictionRuns() ! null) {config.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRuns().toMillis());}if (properties.getMaxWait() ! null) {config.setMaxWaitMillis(properties.getMaxWait().toMillis());}return config;}Bean(destroyMethod destroy)public LettuceConnectionFactory lettuceConnectionFactory() {//开启 自适应集群拓扑刷新和周期拓扑刷新ClusterTopologyRefreshOptions clusterTopologyRefreshOptions ClusterTopologyRefreshOptions.builder()// 开启全部自适应刷新.enableAllAdaptiveRefreshTriggers() // 开启自适应刷新,自适应刷新不开启,Redis集群变更时将会导致连接异常// 自适应刷新超时时间(默认30秒).adaptiveRefreshTriggersTimeout(Duration.ofSeconds(30)) //默认关闭开启后时间为30秒// 开周期刷新.enablePeriodicRefresh(Duration.ofSeconds(20)) // 默认关闭开启后时间为60秒 ClusterTopologyRefreshOptions.DEFAULT_REFRESH_PERIOD 60 .enablePeriodicRefresh(Duration.ofSeconds(2)) .enablePeriodicRefresh().refreshPeriod(Duration.ofSeconds(2)).build();// https://github.com/lettuce-io/lettuce-core/wiki/Client-OptionsClientOptions clientOptions ClusterClientOptions.builder().topologyRefreshOptions(clusterTopologyRefreshOptions).build();LettuceClientConfiguration clientConfig LettucePoolingClientConfiguration.builder().poolConfig(genericObjectPoolConfig(redisProperties.getJedis().getPool()))//.readFrom(ReadFrom.MASTER_PREFERRED).clientOptions(clientOptions).commandTimeout(redisProperties.getTimeout()) //默认RedisURI.DEFAULT_TIMEOUT 60.build();ListString clusterNodes redisProperties.getCluster().getNodes();SetRedisNode nodes new HashSetRedisNode();clusterNodes.forEach(address - nodes.add(new RedisNode(address.split(:)[0].trim(), Integer.valueOf(address.split(:)[1]))));RedisClusterConfiguration clusterConfiguration new RedisClusterConfiguration();clusterConfiguration.setClusterNodes(nodes);clusterConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));clusterConfiguration.setMaxRedirects(redisProperties.getCluster().getMaxRedirects());LettuceConnectionFactory lettuceConnectionFactory new LettuceConnectionFactory(clusterConfiguration, clientConfig);// lettuceConnectionFactory.setShareNativeConnection(false); //是否允许多个线程操作共用同一个缓存连接默认truefalse时每个操作都将开辟新的连接// lettuceConnectionFactory.resetConnection(); // 重置底层共享连接, 在接下来的访问时初始化return lettuceConnectionFactory;}
}二 哨兵模式使用问题
1 问题描述
Redis Sentinel模式应用代码里只配置master节点当master宕机主从切换客户端报错
2 解决方案
通过哨兵连接节点应用连接配置master name应该和实例名称保持一致