springboot2.x中spring.redis.password未生效,主因是手动定义lettuceconnectionfactory时未显式调用setpassword(),导致自动配置失效;另需排查resp3协议兼容性(redis

application.properties里配了spring.redis.password却没生效
Spring Boot 2.x+ 默认用 Lettuce 客户端,spring.redis.password 看似写对了,但实际可能被忽略——尤其当你手动定义了 LettuceConnectionFactory 却没显式传入密码时。Lettuce 不会自动读取这个配置项,它只在 Spring Boot 自动装配时才使用该值。
常见现象:配置文件明明写了 spring.redis.password=abc123,启动后一操作 Redis 就抛 io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required。
- 确认是否自定义了
@Bean的LettuceConnectionFactory:如果写了,就必须手动调用setPassword(RedisPassword.of(...)) - 检查配置项拼写:是
spring.redis.password,不是redis.password或spring.redis.pwd - 确保配置文件加载顺序:若用了
@PropertySource或 profile 激活,application.properties可能没被优先加载 - 避免 YAML 缩进错误:yml 中
password:必须和host:、port:同级,缩进多一个空格就失效
为什么Lettuce不认application.yml里的password
Lettuce 客户端本身不解析 Spring Boot 的属性前缀,它只接收一个 RedisStandaloneConfiguration 实例。Spring Boot 的自动配置类(如 RedisAutoConfiguration)会在内部把 spring.redis.* 映射过去,但一旦你覆盖了 LettuceConnectionFactory Bean,这层映射就断了。
示例问题代码:
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(); // ❌ 没传任何配置,密码被丢弃
}
正确写法必须显式构造并注入密码:
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName("127.0.0.1");
config.setPort(6379);
config.setPassword(RedisPassword.of("abc123")); // ✅ 必须这行
return new LettuceConnectionFactory(config);
}
RESP3协议导致密码认证失败的隐藏陷阱
如果你用的是 Redis 5.x 或更早版本,而 Spring Boot 升级到了 2.6+(自带 Lettuce 6.1+),默认启用 RESP3 协议。但 RESP3 要求 Redis ≥6.0,低版本 Redis 收到 RESP3 认证请求会静默拒绝,表现为“密码无效”或直接报 NOAUTH——其实根本没走到密码校验那步。
- 验证方式:用
redis-cli -h 127.0.0.1 -p 6379 --no-auth-warning连上后执行INFO SERVER,看redis_version字段 - 强制降级到 RESP2:加配置类实现
LettuceClientConfigurationBuilderCustomizer,调用.protocolVersion(ProtocolVersion.RESP2) - 不改协议就升级 Redis:6.0+ 是分水岭,低于它别指望 RESP3
密码配置生效但连接仍失败的其他关键点
即使密码对、协议对、配置也对,还有几个硬性依赖条件容易漏掉:
-
spring.redis.database值必须是整数且在 Redis 实例允许范围内(默认 16 个库,0–15);设成 16 就连不上 -
spring.redis.timeout单位是毫秒,但有些旧版 Lettuce 会把它当秒解析,建议显式写3000ms而非3000 - Redis 服务端必须真正启用了密码:检查
redis.conf中requirepass是否取消注释,且无多余空格或中文标点 - 若 Redis 运行在 Docker 中,确认容器内
redis.conf被正确挂载,宿主机改了配置但容器没 reload 也没用
最常被跳过的动作:改完 redis.conf 后忘了 redis-cli shutdown 再 systemctl start redis,或者用 redis-server /path/to/redis.conf 重载——仅改配置不重启,密码永远不生效。











