背景

项目接入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客户端

  1. 引入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>
  1. 引入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
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐