news 2026/5/1 7:51:27

Spring Boot 3.X:Unable to connect to Redis错误记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot 3.X:Unable to connect to Redis错误记录

一.背景

最近在搭建一个新项目,本着有新用新的原则,项目选择到了jdk17+SpringBoot3.4。但是在测试Redis连接的时候却遇到了以下问题:

redis连不上了。于是我先去检查了配置文件的连接信息,发现没问题;再去检查配置类:

也没发现问题。并且我去启动了以前用SpringBoot2.X的老项目,发现同样的配置下,以前的老项目就能成功连上Redis。那这下就大概可以确定原因了:SpringBoot3.4版本下,引用的spring-boot-starter-data-redis可能有点毛病。

二.发现问题

1.问题发现

既然可能是版本问题,那就只能去github上看看了

果然也有其它人遇到了相同的问题,不过还好这个问题已经被解决了

翻译一下就是:

Lettuce驱动程序版本在Spring Data和Spring Boot版本之间发生了变化,这些版本改变了握手行为。我建议您通过clientOptions.builder(). protocolversion (ProtocolVersion.RESP2).build()来配置LettuceClientConfiguration.clientOptions,来强制RESP2处理,这样你就不会遇到HELLO错误,并且将使用AUTH命令来应用身份验证。

看起来Lettuce客户端已经通过redis/ Lettuce #3035修复了6.5版本的问题。

在任何情况下,这都是驱动程序的问题。

据此可以得到两种解决方案:

(1)手动配置LettuceClientConfiguration.clientOptions的protocolversion

(2)将Lettuce升级到6.5

2.问题验证

我的“spring-boot-starter-data-redis”版本是跟着springboot版本走的,也就是3.4.0

接下来看一下“spring-boot-starter-data-redis”提供的lettuce依赖

可以看,到lettuce依赖版本默认是6.4.1,而不是已经解决bug的6.5。接下来对程序debug验证一下lettuce版本为6.4.1时,LettuceClientConfiguration.clientOptions的protocolversion

可以看到,Spring为我们自动配置的RedisConnectionFactory中,clientOptions的protocolVersion属性为null,没有被设置为RESP2。

三.解决方案

1.手动配置LettuceClientConfiguration.clientOptions的protocolversion

我们不使用Spring为我们自动配置的RedisConnectionFactory,而是自己配置一个LettuceConnectionFactory交给IOC容器管理。在配置LettuceConnectionFactory时通过配置ClientOptions的protocolVersion为RESP2,来解决连接bug。

(1)配置代码

自己配置LettuceConnectionFactory的话还需要引入外部连接池依赖

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> /** * 配置线程池连接工厂LettuceConnectionFactory * @return */ @Bean public LettuceConnectionFactory lettuceConnectionFactory(){ // redis配置 RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(host, port); redisStandaloneConfiguration.setDatabase(dataBase); redisStandaloneConfiguration.setPassword(password); // 连接池配置 GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig(); genericObjectPoolConfig.setMinIdle(minIdle); genericObjectPoolConfig.setMaxIdle(maxIdle); genericObjectPoolConfig.setMaxWait(Duration.ofDays(maxWait)); genericObjectPoolConfig.setMaxTotal(maxActive); // ClientOptions配置 ClientOptions clientOptions = ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build(); // redis客户端配置 LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration .builder() .clientOptions(clientOptions) .commandTimeout(Duration.ofMillis(timeOut)); builder.poolConfig(genericObjectPoolConfig); LettuceClientConfiguration lettuceClientConfiguration = builder.build(); return new LettuceConnectionFactory(redisStandaloneConfiguration,lettuceClientConfiguration); }

(2)启动验证

可以看到此时注入进来的RedisConnectionFactory就是我们自己配置的LettuceConnectionFactory,其ClientOptions的protocolVersion属性为RESP2。Redis可以被正常连接。

2.将Lettuce升级到6.5

这种方法就比较简单粗暴了,既然“spring-boot-starter-data-redis”提供的lettuce依赖版本为6.4,那我们就不用它提供的了,自己引入版本为6.5的lettuce依赖。

(1)配置代码

<!--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> <!--lettuce--> <dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> <version>${lettuce.version}</version> </dependency> <!--外部连接池--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>

其中lettuce.version是6.5.0.RELEASE。最下面的“commons-pool2”是如果要自己配置LettuceConnectionFactory才需要引入,也就是方案一要用到,这里没有删掉。

(2)启动验证

IOC容器中的Spring为我们自动配置的RedisConnectionFactory的clientOptions.protocolVersion仍然是null,但是此时Redis已经可以正常连接上了,说明Lettuce 6.5.0已经解决了认证连接bug。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:42:56

keil5编译器5.06下载深度剖析:安装路径选择建议

Keil5编译器5.06安装路径为何如此关键&#xff1f;一个被低估的开发环境基石 在嵌入式开发的世界里&#xff0c;我们总是热衷于讨论RTOS调度策略、DMA传输效率、Flash擦写寿命这些“高大上”的技术话题。但真正让新手抓狂、老手也偶尔踩坑的&#xff0c;往往不是复杂的算法逻辑…

作者头像 李华
网站建设 2026/5/1 6:56:12

腾讯开源翻译大模型HY-MT1.5实战:术语干预功能详解

腾讯开源翻译大模型HY-MT1.5实战&#xff1a;术语干预功能详解 1. 引言&#xff1a;为何关注HY-MT1.5的术语干预能力&#xff1f; 随着全球化进程加速&#xff0c;机器翻译已从“能翻”迈向“精准翻”的阶段。尤其在专业领域如医疗、法律、金融等&#xff0c;术语的准确性直接…

作者头像 李华
网站建设 2026/5/1 6:26:52

HY-MT1.5-7B应用案例:多语言视频字幕生成系统

HY-MT1.5-7B应用案例&#xff1a;多语言视频字幕生成系统 1. 引言&#xff1a;从翻译模型到智能字幕系统的演进 随着全球化内容消费的快速增长&#xff0c;多语言视频字幕的需求日益旺盛。无论是国际会议、在线教育&#xff0c;还是影视娱乐&#xff0c;用户都期望能够跨越语言…

作者头像 李华
网站建设 2026/5/1 6:25:21

STM32CubeMX中文汉化支持下的工业网关构建:全面讲解

借力STM32CubeMX中文汉化&#xff0c;轻松打造工业级智能网关你有没有经历过这样的场景&#xff1f;手头一个工业项目急着出原型&#xff0c;现场设备五花八门&#xff1a;有走Modbus RTU的温湿度传感器、CANopen协议的电机驱动器&#xff0c;还要对接云平台做远程监控。传统开…

作者头像 李华
网站建设 2026/5/1 7:27:43

Keil中调试Cortex-M硬错误(Hard Fault)核心要点

如何在Keil中精准定位Cortex-M的Hard Fault&#xff1f;一位老工程师的实战手记最近带团队调试一个基于STM32H7的音频处理板卡&#xff0c;又一次碰上了那个让无数嵌入式开发者头皮发麻的问题——系统突然死机&#xff0c;复位后又能跑几秒&#xff0c;循环往复。连接Keil一查&…

作者头像 李华
网站建设 2026/5/1 4:50:41

从零实现CubeMX中FreeRTOS与SD卡驱动联动

如何用 CubeMX 让 FreeRTOS 和 SD 卡“和平共处”&#xff1f;在做嵌入式项目时&#xff0c;你有没有遇到过这种情况&#xff1a;系统要实时采集传感器数据&#xff0c;同时还得把日志写进 SD 卡。结果一调f_write()&#xff0c;整个程序卡住几十毫秒——LED 不闪了&#xff0c…

作者头像 李华