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

[复制链接]
发表于 2025-10-24 12:02:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一.配景

迩来在搭建一个新项目,本着有新用新的原则,项目选择到了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的话还须要引入外部毗连池依靠
  1.         <dependency>
  2.                         <groupId>org.apache.commons</groupId>
  3.                         <artifactId>commons-pool2</artifactId>
  4.                 </dependency>
  5.     /**
  6.      * 配置线程池连接工厂LettuceConnectionFactory
  7.      * @return
  8.      */
  9.     @Bean
  10.     public LettuceConnectionFactory lettuceConnectionFactory(){
  11.         // redis配置
  12.         RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(host, port);
  13.         redisStandaloneConfiguration.setDatabase(dataBase);
  14.         redisStandaloneConfiguration.setPassword(password);
  15.         // 连接池配置
  16.         GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
  17.         genericObjectPoolConfig.setMinIdle(minIdle);
  18.         genericObjectPoolConfig.setMaxIdle(maxIdle);
  19.         genericObjectPoolConfig.setMaxWait(Duration.ofDays(maxWait));
  20.         genericObjectPoolConfig.setMaxTotal(maxActive);
  21.         // ClientOptions配置
  22.         ClientOptions clientOptions = ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build();
  23.         // redis客户端配置
  24.         LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder
  25.                 builder =  LettucePoolingClientConfiguration
  26.                 .builder()
  27.                 .clientOptions(clientOptions)
  28.                 .commandTimeout(Duration.ofMillis(timeOut));
  29.         builder.poolConfig(genericObjectPoolConfig);
  30.         LettuceClientConfiguration lettuceClientConfiguration = builder.build();
  31.         return new LettuceConnectionFactory(redisStandaloneConfiguration,lettuceClientConfiguration);
  32.     }
复制代码
(2)启动验证

可以看到此时注入进来的RedisConnectionFactory就是我们自己设置的LettuceConnectionFactory,其ClientOptions的protocolVersion属性为RESP2。Redis可以被正常毗连。
2.将Lettuce升级到6.5

这种方法就比力简朴粗暴了,既然“spring-boot-starter-data-redis”提供的lettuce依靠版本为6.4,那我们就不消它提供的了,自己引入版本为6.5的lettuce依靠。
(1)设置代码
  1.         <!--redis-->
  2.                 <dependency>
  3.                         <groupId>org.springframework.boot</groupId>
  4.                         <artifactId>spring-boot-starter-data-redis</artifactId>
  5.                         <exclusions>
  6.                                 <exclusion>
  7.                                         <groupId>io.lettuce</groupId>
  8.                                         <artifactId>lettuce-core</artifactId>
  9.                                 </exclusion>
  10.                         </exclusions>
  11.                 </dependency>
  12.                 <!--lettuce-->
  13.                 <dependency>
  14.                         <groupId>io.lettuce</groupId>
  15.                         <artifactId>lettuce-core</artifactId>
  16.                         <version>${lettuce.version}</version>
  17.                 </dependency>
  18.                 <!--外部连接池-->
  19.                 <dependency>
  20.                         <groupId>org.apache.commons</groupId>
  21.                         <artifactId>commons-pool2</artifactId>
  22.                 </dependency>
复制代码
此中lettuce.version是6.5.0.RELEASE。最下面的“commons-pool2”是如果要自己设置LettuceConnectionFactory才须要引入,也就是方案一要用到,这里没有删掉。
(2)启动验证

IOC容器中的Spring为我们主动设置的RedisConnectionFactory的clientOptions.protocolVersion仍然是null,但是此时Redis已经可以正常毗连上了,阐明Lettuce 6.5.0已包揽理了认证毗连bug。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表