springboot连接Redis报NOAUTH Authentication required

背景

项目接入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.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettucegroupId>
            <artifactId>lettuce-coreartifactId>
        exclusion>
    exclusions>
dependency>

<dependency>
    <groupId>redis.clientsgroupId>
    <artifactId>jedisartifactId>
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

你可能感兴趣的:(spring,boot,redis,后端)