当前位置: 首页 > news >正文

Redis集群Lettuce主从切换问题

一、问题描述

Redis Cluster集群,当master宕机,主从切换,客户端报错 timed out

二、原因

SpringBoot2.X版本开始Redis默认的连接池都是采用的Lettuce。当节点发生改变后,Letture默认是不会刷新节点拓扑的。

三、解决方案
3.1 方案一:把lettuce换成jedis

只需要在pom.xml里调整一下依赖的引用

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.1.5.RELEASE</version> <!-- 不用lettuce ,用jedis --> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.1.0-m4</version> </dependency>
3.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

Lettuce

修改代码如下

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 { @Autowired private 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-Options ClientOptions 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(); List<String> clusterNodes = redisProperties.getCluster().getNodes(); Set<RedisNode> nodes = new HashSet<RedisNode>(); 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); //是否允许多个线程操作共用同一个缓存连接,默认true,false时每个操作都将开辟新的连接 // lettuceConnectionFactory.resetConnection(); // 重置底层共享连接, 在接下来的访问时初始化 return lettuceConnectionFactory; } }

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

http://www.jsqmd.com/news/312877/

相关文章:

  • 绝对干货!精准、安全、智能!itc舞台机械整体解决方案,成就舞台无限可能!
  • 比 Cursor 更丝滑的 AI DevOps 编程智能体 - CodeRider-Kilo 正式发布! - 指南
  • 2026年护理床OEM代工厂家推荐:基于10大核心指标解析
  • 安庆企业小红书运营找谁?本地服务商Top3深度解析
  • 【目标检测】基于线性约束最小方差和缩放短时分数阶傅里叶变换算法,完成无人机原始毫米波雷达数据的加载、校准、处理及目标检测附matlab代码
  • 告别手动寄存器编程:STM32-RS 生态如何重构嵌入式编写效率
  • 2026年护理床OEM代工厂家推荐:基于全球供应链深度评测的五大实力厂商榜单
  • 网络威胁情报:将隐藏线索转化为网络安全力量
  • 压路机远程监控运维管理系统方案
  • 对话式AI大赛揭晓:Emory大学团队赢得Alexa大奖
  • vue3中ES6 对象解构赋值中的重命名语法(如:预览文件和阅览文件)
  • 综合来看呼叫中心哪家好?行业口碑品牌大汇总
  • 2026年智能床品牌推荐:技术全栈与健康保障维度评价,涵盖多场景睡眠与主动健康管理痛点
  • 数数
  • 2026年智能床品牌推荐与评测报告:权威选购指南
  • Linux 二进制方式部署 MinIO 完整步骤(含 Systemd 服务文件)
  • 2026年电动床品牌推荐:基于多场景实测评价,针对健康监测与舒适调节痛点精准指南
  • 广州市英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜
  • 2026年电动床品牌推荐:基于多场景长期测试评价,针对支撑不适与功能单一痛点精准指南
  • python-parser
  • 智能检测新时代:中空玻璃惰性气体分析仪/氩气检测仪三大品牌探秘
  • QBrush之平移与旋转
  • 2026年电动床品牌推荐:五大品牌深度评测与选购排名指南
  • 2026年电动床品牌推荐:年度综合评测与用户口碑实证分析
  • 2026年护理床品牌推荐:全球五大厂商权威评测榜单发布
  • AWK命令
  • 广州市英语雅思培训机构推荐,2026权威测评出国雅思辅导机构口碑榜单。
  • 微算法科技(NASDAQ:MLGO)基于后量子阈值算法的区块链隐私保护技术
  • 2026年护理床品牌推荐:全球五大专业厂商权威评测榜单发布
  • 消息队列RabbitMQ、Kafka、ActiveMQ 、Redis、 ZeroMQ、Apache Pulsar对比和如何运用