工作中的點點滴滴-lettuce連線池連線redis失敗
阿新 • • 發佈:2022-03-17
背景
新專案為了推進多環境(test,pre,prd)部署,在測試環境測試通過之後部署預發環境的時候,服務一直報錯,提示【io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required.】,這個提示一般情況下的意思是:redis服務配置了密碼,客戶端連結的時候沒有填寫密碼。但是程式碼和測試環境同一套的,在測試環境都正常測試通過了的。
分析
先查看了測試環境和預發環境的redis是不是同一個版本的(因為你不知道運維給你的版本會是多少年前的老古董),預發環境是4.1.1的。然後我的springboot的版本是2.4.13的,使用的lettuce是6.0.8的,Lettuce 6.x版本開始,使用RESP3(Redis 6.x引入)的HELLO命令進行版本自適應判斷,但是對於不支援HELLO命令的低版本例項,相容性存在一定問題。所以對於低版本的例項,建議直接在Lettuce中指定使用RESP2協議(相容Redis 4/5)的版本來使用。
解決方案
第一種:修改協議
1 import io.lettuce.core.ClientOptions; 2 import io.lettuce.core.protocol.ProtocolVersion; 3 import org.springframework.boot.autoconfigure.data.redis.LettuceClientConfigurationBuilderCustomizer; 4 import org.springframework.context.annotation.Configuration; 5 import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;6 7 @Configuration 8 public class SpringConfig implements LettuceClientConfigurationBuilderCustomizer { 9 10 @Override 11 public void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) { 12 // manually specifying RESP2 13 clientConfigurationBuilder.clientOptions(ClientOptions.builder()14 .protocolVersion(ProtocolVersion.RESP2) 15 .build()); 16 } 17 }
第二種:使用低版本的lettuce
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-data-redis</artifactId> 4 <exclusions> 5 <exclusion> 6 <groupId>io.lettuce</groupId> 7 <artifactId>lettuce-core</artifactId> 8 </exclusion> 9 </exclusions> 10 </dependency> 11 <dependency> 12 <groupId>io.lettuce</groupId> 13 <artifactId>lettuce-core</artifactId> 14 <version>5.3.7.RELEASE</version> 15 <scope>compile</scope> 16 </dependency>