redisconnectionexception 主因是连接链路受阻,需逐层排查:①redis服务未启动或配置地址/端口不匹配;②protected-mode限制远程连接;③lettuce与redis协议版本不兼容(如resp3/resp2);④防火墙或云安全组屏蔽6379端口。

绝大多数情况下,RedisConnectionException 不是代码写错了,而是连接链路某处被拦住了——得一层层剥开看。
Redis 服务没跑起来或根本连不上
这是最常被忽略的第一步。哪怕你写了 redisTemplate.opsForValue().set("k","v"),如果 Redis 进程压根没启动,或者监听的地址/端口和配置对不上,就会直接抛 io.lettuce.core.RedisConnectionException: Unable to connect to 127.0.0.1:6379。
- 先用命令行验证:执行
redis-cli ping,返回PONG才算通;如果报Could not connect to Redis at 127.0.0.1:6379: Connection refused,说明服务没起或端口不对 - Linux 下检查进程:
ps -ef | grep redis;Windows 下确认redis-server.exe是否双击运行(不是仅解压完就完事) - 确认
application.yml里spring.redis.host和spring.redis.port和你实际启动 Redis 的地址一致——比如 Redis 改了端口为6380,但配置还写6379,必然失败
Redis 启用了保护模式(protected-mode)但没配密码或没放开绑定
Redis 3.2+ 默认开启 protected-mode yes,此时只允许本地回环(127.0.0.1)连接。一旦 Spring Boot 应用不在本机(比如 Docker 容器、远程服务器、阿里云 ECS),就会卡在 DENIED Redis is running in protected mode。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 编辑
redis.conf,找到并修改两行:bind 127.0.0.1→ 注释掉(即加#)protected-mode yes→ 改成protected-mode no - 如果不想关保护模式,就启用密码认证:在
redis.conf中设requirepass yourpassword,然后 Spring Boot 配置里必须加spring.redis.password: yourpassword - 改完配置必须重启 Redis:
redis-server /path/to/redis.conf,不是 reload
Lettuce 协议版本不匹配(尤其 Redis 5.x + Lettuce 6.x)
Spring Boot 3.x 默认带 Lettuce 6.x,它默认用 RESP3 协议;但 Redis 5.0 及更早版本只支持 RESP2。这时你会看到 NOAUTH Authentication required 或连接后立即断开,日志里还有 <unresolved></unresolved> 提示 DNS 解析失败——其实不是 DNS 问题,是协议握手失败导致连接未建立。
- 临时验证:用
redis-cli -h xxx -p 6379 --raw INFO server查redis_version,再查对应版本支持的协议 - 强制降级到 RESP2:在
@Configuration类中手动构建LettuceConnectionFactory,调用clientOptions(ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build()) - 或者降级 Lettuce 版本(不推荐),Spring Boot 2.7.x 默认 Lettuce 5.x 就没这问题
防火墙、安全组或网络策略挡住了 6379 端口
本地开发很少遇到,但一上云服务器(阿里云、腾讯云、AWS)几乎必踩。即使 Redis 跑着、配置全对、协议也匹配,只要 6379 端口没放行,RedisConnectionException 就稳稳报给你。
- Linux 服务器:运行
firewall-cmd --list-ports看是否含6379/tcp;没有就加:firewall-cmd --zone=public --add-port=6379/tcp --permanent && firewall-cmd --reload - 云厂商控制台:进「安全组」规则,确认入方向(Inbound)已添加 TCP 6379 端口,授权对象别写错(比如写成
0.0.0.0/0才能从任意 IP 连) - 本地测试远程 Redis 时,还要确认自己电脑的 outbound 没被公司防火墙拦截——可以先用 telnet 或 nc 测试:
nc -zv your-redis-ip 6379
真正麻烦的往往不是单点故障,而是多个条件叠加:比如 Redis 开了密码,但配置漏写了 password;同时 protected-mode 没关,又恰好云服务器安全组没开 6379 —— 日志只报最外层异常,得一个个排除。动手前,先问自己一句:你能用 redis-cli -h x.x.x.x -p 6379 -a yourpass ping 直连成功吗?不能,就别急着改 Java 代码。










