Spring Boot Starter Data Redis使用Lettuce客户端报错:NOAUTH Authentication required

Posted Howinfun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot Starter Data Redis使用Lettuce客户端报错:NOAUTH Authentication required相关的知识,希望对你有一定的参考价值。

1. 背景

Spring Boot版本升级为:2.6.14
redis依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

redis配置不变,还是带password的:

项目启动后,获取redis连接时,报错:NOAUTH Authentication required

2. 问题分析

spring-boot-starer-data-redis支持使用Jedis和Lettuce作为redis客户端,如果配置不指定则默认使用Lettuce。

不管是Lettuce还是还是Jedis,核心是构建RedisConnectionFactory。


不管是Lettuce还是Jedis,都支持单节点、哨兵模式和集群模式的Redis服务端,并且对应的配置都会设置上Password,证明和配置和代码没关系。



所以说,源码和配置都是没问题的,只要配置了密码,就一定会设置到客户端里面。

3. 问题所在

那是什么原因?初步猜测是redis客户端和服务端版本上的一些支持问题。
看看Spring Boot2.6.14的Lettuce版本基本是保持在比较新的了:

再看看我们的redis服务端的版本:
我的天,现在redis都出到6了吧。。

现在这么一看,最快的解决方法应该是降级Lettuce。
我们试试降级到5.x

项目启动,这次不是认证问题,而是找不到一些常量,此版本的spring-boot-starter-data-redis和5.x的Lettuce并不兼容,所以说,不能只是降低Lettuce版本,要不就直接降低spring-boot-starter-data-redis的版本,但是既然升级到新版本的SpringBoot,肯定就是想使用新的特性和支持,不可能又单独将某个组件降级回去吧。。

没啥头绪,直接到官网看看Lettuce的版本介绍吧。
看了最近几个版本的介绍,有和Redis版本直接相关的是Lettuce6.0,其中介绍支持Redis6的RESP3协议。

到源码里面搜,还真的搜出点东西:
意思是说,到Lettuce6.0后,将使用RESP3协议,而RESP3协议是Redis6.0才支持的,那么我们的Redis服务端版本才2.8.x,肯定是废掉的了。

所以解决方法基本还是围绕Lettuce的版本解决,要不就是将spring-boot-starter-redis进行降级(不考虑),将对应的Lettuce版本也降到5.2以下,要不就是将RESP3协议改为使用RESP2协议。
那我们肯定是选择后者的,因为Lettuce6.0版本也提到,同时支持RESP2和RESP3。
至于怎么修改RESP协议,这里直接上代码。

项目启动成功,并操作Redis成功:

spring-data-jpa 和 spring-boot-starter-data-jpa 的区别

【中文标题】spring-data-jpa 和 spring-boot-starter-data-jpa 的区别【英文标题】:Difference between spring-data-jpa and spring-boot-starter-data-jpa 【发布时间】:2017-11-29 18:56:19 【问题描述】:

这可能不是最好的问题,但我注意到有 2 个 Spring JPA 用于 Spring boot。他们有什么不同。目前我正在尝试将 SpringBoot 1.5.3 项目与休眠一起设置。我记得我之前用 spring-boot-starter-data-jpa 用 JPA 设置了 Springboot。

我见过的大多数在线示例以及 starter.spring.io 都为 spring jpa 提供了以下依赖项。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

但在一个现有项目中,我遇到了 spring-data-jpa

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.11.4.RELEASE</version>
</dependency>

如果他们有什么不同,做一些谷歌并没有告诉我。

在我之前添加 JPA 的所有项目中,虽然是 JPA 2.1/Hibernate,这就是为什么我有点不确定在我的新 SpringBoot 应用程序中使用这两者中的哪一个。

【问题讨论】:

使用 Spring Boot。跟随指南:spring.io/guides/gs/accessing-data-jpa @duffymo 感谢您的参考。这就是我在遇到 org.springframework.data -> spring-data-jpa 之前完成我的 spring boot jpa 设置的方法 【参考方案1】:

如docs 中所述,starter 是此特定库的所有必需依赖项的便捷内联器,即本身包含其他依赖项,而不是您手动编写这些依赖项。

查看spring-boot-starter-data-jpa pom.xml,您会看到它包含spring-data-jpa 作为许多其他依赖项。

Spring Boot Starters 是一组方便的依赖描述符 您可以将其包含在您的应用程序中。您可以获得一站式服务 您需要的所有 Spring 和相关技术,而无需 搜索示例代码并复制粘贴大量依赖项 描述符。例如,如果您想开始使用 Spring 和 用于数据库访问的 JPA 仅包含 spring-boot-starter-data-jpa 项目中的依赖项,一切顺利。

【讨论】:

那么 org.springframework.data -> spring-data-jpa 是在哪里出现的,还是 spring-boot-starter-data-jpa 包含 spring-data-jpa Artem 说得对:Spring Boot 版本引入了 Spring JPA JAR 和其他作为其依赖项。 @Acewin 我更新了答案(请参阅 pom.xml 部分)。 @ArtemNovikov 非常好的参考。 POM 文件确实很清楚。而且github中所有spring boot starter的参考页面真的很不错。【参考方案2】:

在 pom.xml 中检查 spring-boot-starter-data-jpa:https://github.com/spring-projects/spring-boot/blob/master/spring-boot-starters/spring-boot-starter-data-jpa/pom.xml

阅读描述标签,上面写着:“使用 Spring Data JPA 和 Hibernate 的入门”。

所以 spring-boot-starter-data-jpa 使用带有 Hibernate 的 Spring Data JPA 作为实现。可以这么说,这是硬编码的。

如果您现在检查 pom.xml 中的 spring-data-jpa,它与实现无关。要在任何项目中使用 Spring Data JPA,必须提供要使用的实现。不这样做会给你一个错误。

Spring Data JPA 文档声明它当前支持 Hibernate 5、(Apache) OpenJPA 2.4 和 EclipseLink 2.6.1。在这里阅读:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#new-features.1-10-0

【讨论】:

其他人已经帮我提供了项目的 pom.xml 链接

以上是关于Spring Boot Starter Data Redis使用Lettuce客户端报错:NOAUTH Authentication required的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot-starter-data-jpa 以非零退出值 1 结束

Spring boot集成spring-boot-starter-data-jpa环境搭建

spring-data-jpa 和 spring-boot-starter-data-jpa 的区别

spring-boot-starter-data-jpa 依赖错误

Spring Boot 自动重新配置在 spring-boot-data-starter-jdbc 上不起作用

聊聊spring-boot-starter-data-redis的配置变更