Redis和 Redisson 集成踩坑日记

异常报错

报错信息:关键报错:ERR Client sent AUTH, but no password is set

Redis和 Redisson 集成,如果 Redis 没有设置密码,必须注释掉,不然Redisson就会主动发起验证

复制代码
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    # password:  # ← 这行必须删除或注释
    database: 0

根本解决办法

详细报错:

复制代码
org.redisson.client.RedisException: ERR Client sent AUTH, but no password is set. channel: [id: 0xb67a741f, L:/127.0.0.1:64404 - R:127.0.0.1/127.0.0.1:6379] command: (AUTH), params: (password masked)
	at java.base/java.util.concurrent.CompletableFuture.encodeRelay(CompletableFuture.java:368)
	at java.base/java.util.concurrent.CompletableFuture.completeRelay(CompletableFuture.java:377)
	at java.base/java.util.concurrent.CompletableFuture$UniRelay.tryFire(CompletableFuture.java:1097)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
	at org.redisson.client.protocol.CommandData.tryFailure(CommandData.java:87)
	at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:422)

这个错误信息非常明确:Redis 服务器没有设置密码,但客户端(Redisson)却尝试发送 AUTH 命令(即要求密码认证)。这是典型的配置不匹配问题。

🔍 错误核心原因

复制代码
ERR Client sent AUTH, but no password is set.
  • Redis 服务器 :未配置密码(requirepass 未设置)

  • Redisson 客户端 :配置了 password(在 application.yml 中指定了密码)


✅ 解决方案(2 种方式)

⚙️ 方式 1:移除客户端密码配置(推荐,最简单)

这是最可能的解决方案,因为你的 Redis 服务没有设置密码。

1、打开 application.yml(或 application.properties

2、删除或注释掉

复制代码
spring.redis.password

配置:

复制代码
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    # password: your_password  # ← 删除或注释掉这一行!
    database: 0
⚙️ 方式 2:在 Redis 中设置密码(如果需要密码)

如果确实需要密码认证,请同时修改 Redis 配置和客户端配置

1、修改 Redis 配置

复制代码
redis.windows.conf

# 取消注释并设置密码(示例密码:123456)
requirepass 123456

2、同步修改客户端配置

复制代码
application.yml

spring:
  redis:
    password: 123456  # 必须与 Redis 配置的密码一致

3、重启 Redis 服务(关键!)

复制代码
# 先停止当前 Redis
taskkill /f /im redis-server.exe

# 重新启动 Redis(带新配置)
redis-server.exe redis.windows.conf

🛠️ 为什么会出现这个问题?

💡 关键点 :Redis 服务没有密码 ,但客户端错误地配置了密码 ,导致 Redis 报错 ERR Client sent AUTH, but no password is set.

📌 最终建议

优先使用方式 1(移除密码配置),因为:

  1. 你之前能用 redis-cli ping 成功连接,说明 Redis 没有密码

  2. 配置简单,无需修改 Redis 服务

  3. 避免因密码不一致导致的其他连接问题

正确配置示例(无密码):

复制代码
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    # password:  # ← 这行必须删除或注释
    database: 0

💡 为什么之前没报错?

你之前启动时可能没有配置密码 ,但 RedissonAutoConfiguration 会尝试连接时默认不带密码 。当你的 application.yml 错误地配置了密码 后,Redisson 就会发送 AUTH 命令,触发这个错误。

总结删除 spring.redis.password 配置,问题即可解决!

其他问题排查:验证Redis 是否正常启动

1. 启动 Redis 服务(最常见原因)

在 Windows 上,Redis 通常是以服务形式运行,或者通过命令行启动。请检查任务管理器中是否有 redis-server.exe 进程。

如果没有,请打开 CMD(命令提示符)PowerShell ,进入你的 Redis 安装目录(例如 D:\RedisC:\Program Files\Redis),执行以下命令:

方法 A:使用服务命令启动(推荐)

如果你之前已经安装过 Redis 为 Windows 服务:

复制代码
# 启动服务
net start redis

如果提示"系统错误",请尝试使用方法 B。

方法 B:命令行直接启动(调试用)

这种方式会占用一个 CMD 窗口,关闭窗口服务即停止,适合用来查看启动日志。

复制代码
# 进入 Redis 目录后执行(假设配置文件名为 redis.windows.conf)
redis-server.exe redis.windows.conf
  • 注意: 如果双击 redis-server.exe 会瞬间闪退,必须通过命令行运行才能看到报错信息。

2. 验证 Redis 是否正常工作

在启动服务的窗口保持打开的状态下,重新打开一个新的 CMD 窗口,进入 Redis 目录,执行:

复制代码
redis-cli.exe

进入交互模式后,输入:

复制代码
ping
  • 如果返回 PONG:说明 Redis 服务端已经正常启动,问题可能出在你的 Spring Boot 项目的配置(如密码、端口不一致)。

  • 如果报错:说明服务端本身有问题,需要根据 CMD 的报错信息修复 Redis。

3. 检查配置文件 (redis.windows.conf)

在 Windows 的 Redis 安装目录下,找到 redis.windows.conf 文件,检查以下几项配置:

1、端口检查: 确保 port 6379 没有被注释(前面没有 #),且没有被修改为其他端口。

2、保护模式 (关键):

如果你是远程连接或者遇到连接拒绝,找到

复制代码
protected-mode

这一行:

复制代码
protected-mode no

建议在开发环境下将其设置为 no,或者确保你配置了密码。

3、绑定 IP:

如果你只想本地连接,确保有这一行(默认通常都有):

复制代码
bind 127.0.0.1

4、密码设置:

如果你设置了密码,请找到

复制代码
requirepass

并取消注释:

复制代码
requirepass yourpassword

如果设置了密码,记得在 Spring Boot 的 application.yml 中配置相同的密码。

总结流程图

  1. 去 Redis 安装目录。

  2. 运行 redis-server.exe redis.windows.conf (看有没有报错)。

  3. 新开窗口运行 redis-cli ping (看是否返回 PONG)。

  4. 如果第 3 步成功,再启动你的 Spring Boot 项目。

如果前面3 步都成功了,还是报错

报错信息:

复制代码
 Failed to instantiate [org.redisson.api.RedissonClient]: Factory method 'redisson' threw exception with message: java.util.concurrent.ExecutionException: org.redisson.client.RedisConnectionException: Unable to connect to Redis server: 127.0.0.1/127.0.0.1:6379
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:178)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:644)
	... 131 common frames omitted
Caused by: org.redisson.client.RedisConnectionException: java.util.concurrent.ExecutionException: org.redisson.client.RedisConnectionException: Unable to connect to Redis server: 127.0.0.1/127.0.0.1:6379
	at org.redisson.connection.MasterSlaveConnectionManager.doConnect(MasterSlaveConnectionManager.java:228)
	at org.redisson.connection.MasterSlaveConnectionManager.connect(MasterSlaveConnectionManager.java:188)
	at org.redisson.connection.ConnectionManager.create(ConnectionManager.java:98)

排除报错方案二

既然你已经确认在 Windows 命令行中 redis-server 能启动,且 redis-cli ping 能返回 PONG,说明 Redis 服务端本身是健康的

问题出在 Spring Boot 应用(Redisson 客户端)Redis 服务端 的连接握手环节。ExecutionExceptionRedisConnectionException 通常意味着网络可达性问题或协议/认证不匹配。

请按照以下高级排查方案进行检查:

1. 检查 redisson.yaml 配置文件(关键)

你使用了 Redisson,它支持独立的配置文件。如果项目中存在 redisson.yamlredisson.json,它会覆盖 application.yml 中的配置。

  • 检查点:resources 目录下找找有没有 redisson.yaml

  • 问题: 里面可能配置了错误的 IP、端口,或者配置的是集群模式(clusterServersConfig),但你本地运行的是单机版(singleServerConfig)。

  • 解决: 如果不需要复杂配置,暂时删除或重命名 redisson.yaml,让 Spring Boot 使用默认的自动配置。

2. Windows 防火墙拦截(极易被忽视)

虽然 localhost 是本机回环,但在某些 Windows 网络配置或安全策略下,防火墙可能会拦截 Java 进程与 Redis 进程的通信。

  • 操作: 暂时关闭 Windows 防火墙,或者在防火墙的"入站规则"中,添加 redis-server.exejava.exe 为允许。

  • 验证: 关闭防火墙后重启 Spring Boot 项目,看是否报错消失。

3. IP 地址解析问题

虽然你配置的是 127.0.0.1,但日志里显示的是 localhost/127.0.0.1。有时 Java 或 Netty(Redisson 的网络层)在解析 localhost 时可能会尝试 IPv6 或者解析失败。

  • 解决:强制使用 IP。在application.yml中,不要写localhost,明确写成:

    spring:
    redis:
    host: 127.0.0.1
    port: 6379

4. 密码认证不匹配(Silent Fail)

如果 Redis 设置了密码,但客户端没配,或者客户端配了但 Redis 没设,有时候会表现为"连接失败"而不是"认证失败"。

  • 检查 Redis 配置:

打开redis.windows.conf,搜索requirepass

  • 如果有值(例如 requirepass 123456),确保 application.yml 中的 spring.redis.password 填写正确。

    如果没有值(注释状态),确保 application.yml不要 配置 password,或者将其留空。

5. 端口被占用或冲突

虽然 redis-cli ping 能通,但可能有多个 Redis 实例在竞争。

  • 操作:

    在 CMD 中运行:

    netstat -ano | findstr :6379

  • 检查: 如果看到状态是 LISTENING,记下 PID。如果这个 PID 不是你刚刚启动的 redis-server 的 PID,说明端口被其他程序占用了。你需要结束那个进程,或者修改 Redis 的端口。

6. Spring Boot 版本与 Redisson 版本不兼容

如果你的 Spring Boot 版本较新(如 3.x),而 Redisson 版本较老,可能会出现序列化或驱动层面的冲突。

  • 建议: 检查 pom.xmlbuild.gradle

  • 解决: 尝试升级 Redisson 到最新版本,或者使用 Spring Boot 官方推荐的版本组合。

文章转载自: ++古渡蓝按++

原文链接: https://www.cnblogs.com/blbl-blog/p/19475905

体验地址: http://www.jnpfsoft.com/?from=001YH

相关推荐
zgl_200537792 小时前
源代码:ZGLanguage 解析SQL数据血缘 之 显示 WITH SQL 结构图
大数据·数据库·数据仓库·sql·数据治理·etl·数据血缘
五阿哥永琪2 小时前
MySQL 核心机制精讲:B+树查询、Buffer Pool、COUNT 优化与 CHAR/VARCHAR 实战指南
数据库·b树·mysql
短剑重铸之日2 小时前
《7天学会Redis》特别篇:Redis十大经典面试题2
数据库·redis·后端·缓存·架构
草莓熊Lotso2 小时前
Linux 命令行参数与环境变量实战:从基础用法到底层原理
linux·运维·服务器·开发语言·数据库·c++·人工智能
SickeyLee2 小时前
SQL常见知识点汇总
数据库·sql·oracle
豆芽脚脚10 小时前
MongoDB 导出和导入完整指南
数据库·mongodb
烧饼Fighting11 小时前
Mysql替换为瀚高数据库部分函数转换V4.5版本
数据库·mysql
上善若水_厚德载物11 小时前
Centos7 Mysql 5.7 读写分离
数据库·mysql
Mr__Miss11 小时前
Redis的持久化
数据库·redis·缓存