马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一.配景
迩来在搭建一个新项目,本着有新用新的原则,项目选择到了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。
|