背景
項目接入redis,連接報錯NOAUTH Authentication required
,百度後是沒有輸入密碼,但是在測試環境是正常的。修改多次密碼失效,直接使用redis-cli連接,也是隻有沒輸入密碼時纔會報這個錯,密碼錯誤是另一個提示。那應該和redis版本和redis客戶端有關
根因
redis 3.0版本僅支持RESP2的通信協議,而Lettuce 6.x版本開始,使用RESP3(Redis 6.x引入)的HELLO命令進行版本自適應判斷,但是對於不支持HELLO命令的低版本實例,兼容性存在一定問題。剛好springboot版本默認的引入的redis客戶端是lettuce 6.x ,協議不通。
修改方案
升級redis到6.0以上
保持環境一致,暫不考慮,因爲redis升級只是新增命令,其實風險比較小。
lettuce使用RESP 2協議
package com.chinaroad.parking.config;
import io.lettuce.core.ClientOptions;
import io.lettuce.core.protocol.ProtocolVersion;
import org.springframework.boot.autoconfigure.data.redis.LettuceClientConfigurationBuilderCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
@Configuration
public class SpringConfig implements LettuceClientConfigurationBuilderCustomizer {
@Override
public void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) {
// manually specifying RESP2
clientConfigurationBuilder.clientOptions(ClientOptions.builder()
.protocolVersion(ProtocolVersion.RESP2)
.build());
}
}
切換jedis客戶端
- 引入jedis客戶端(版本統一被springboot管理了,所以不用指定版本),排除lettuce pom.xml
<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>
<!-- 增加jedis依賴 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
- 引入jedis客戶端,不排除lettuce,切換jedis客戶端
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
application.propertis
spring.redis.client-type=jedis
對於體積來說還是去除lettuce好點。
tip
如何測試redis是否支持RESP3版本
連接redis後,直接發起命令,如果返回了版本號,說明支持
HELLO 3