Redis和 Redisson 集成踩坑日记

异常报错

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

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

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

根本解决办法

详细报错:

java 复制代码
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 命令(即要求密码认证)。这是典型的配置不匹配问题。

🔍 错误核心原因

text 复制代码
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

    配置:

    yaml 复制代码
    spring:
      redis:
        host: 127.0.0.1
        port: 6379
        # password: your_password  # ← 删除或注释掉这一行!
        database: 0

⚙️ 方式 2:在 Redis 中设置密码(如果需要密码)

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

  1. 修改 Redis 配置

    复制代码
    redis.windows.conf
    conf 复制代码
    # 取消注释并设置密码(示例密码:123456)
    requirepass 123456
  2. 同步修改客户端配置

    复制代码
    application.yml
    yaml 复制代码
    spring:
      redis:
        password: 123456  # 必须与 Redis 配置的密码一致
  3. 重启 Redis 服务(关键!)

    cmd 复制代码
    # 先停止当前 Redis
    taskkill /f /im redis-server.exe
    
    # 重新启动 Redis(带新配置)
    redis-server.exe redis.windows.conf

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

配置项 Redis 服务 Spring Boot 客户端 状态
requirepass 未设置(默认无密码) 设置了 password: abc ❌ 不匹配
requirepass 设置了 123456 未设置 password ❌ 不匹配
requirepass 未设置 未设置 password ✅ 匹配

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

📌 最终建议

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

  1. 你之前能用 redis-cli ping 成功连接,说明 Redis 没有密码
  2. 配置简单,无需修改 Redis 服务
  3. 避免因密码不一致导致的其他连接问题

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

yaml 复制代码
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 服务:

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

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

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

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

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

2. 验证 Redis 是否正常工作

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

cmd 复制代码
redis-cli.exe

进入交互模式后,输入:

bash 复制代码
ping
  • 如果返回 PONG:说明 Redis 服务端已经正常启动,问题可能出在你的 Spring Boot 项目的配置(如密码、端口不一致)。
  • 如果报错:说明服务端本身有问题,需要根据 CMD 的报错信息修复 Redis。

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

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

  1. 端口检查:

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

  2. 保护模式 (关键):

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

    复制代码
    protected-mode

    这一行:

    conf 复制代码
    protected-mode no

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

  3. 绑定 IP:

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

    conf 复制代码
    bind 127.0.0.1

4.密码设置:

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

复制代码
requirepass

并取消注释:

conf 复制代码
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 步都成功了,还是报错

报错信息:

java 复制代码
 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

    明确写成:

    yaml 复制代码
    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 中运行:

    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 官方推荐的版本组合。