Spring Boot 连云端 Redis 集群失败主因是集群返回内网 IP 导致网络不可达;需为每个节点显式配置 cluster-announce-ip(公网 IP)、cluster-announce-port 和 cluster-announce-bus-port,并确保所有节点均生效。

Spring Boot 连云端 Redis 集群时连不上,十有八九不是代码问题,而是网络拓扑卡在了 NAT 后面 —— 客户端能连上集群节点列表里的 IP,但集群返回的 MOVED 重定向地址却是内网 IP(比如 10.0.1.5:6379),而你的 Spring Boot 应用根本访问不到这个地址。
为什么 Spring Boot 会收到内网 IP 重定向?
Redis Cluster 节点在响应 ASK 或 MOVED 时,返回的是自己配置的 cluster-announce-ip(或自动探测出的绑定 IP)。如果没显式设置,它默认用 bind 或本地网卡地址 —— 在云环境(如 AWS EC2、阿里云 ECS、腾讯云 CVM)里,这几乎总是内网 IP。
Spring Boot 的 Lettuce 客户端拿到这个地址后,会直接尝试连接,失败就抛 RedisCommandTimeoutException 或无限重试,日志里常看到类似:
Unable to connect to 10.0.1.5:6379
这不是密码错、端口错,是网络不可达。
-
cluster-announce-ip必须设为公网可路由的地址(比如云服务器的弹性公网 IP 或绑定的域名) - 不能依赖
bind 0.0.0.0—— 它只控制监听,不控制集群通告 - 若用 Docker/K8s,还要额外处理容器网络和宿主机网络的映射关系
如何配置 cluster-announce-ip?
在每个 Redis 节点的 redis.conf 中,**必须显式添加以下三行**(顺序无关,但缺一不可):
cluster-announce-ip 120.79.100.22 # 替换为该节点实际的公网 IP cluster-announce-port 6379 # 必须与 port 一致(除非你做了端口映射) cluster-announce-bus-port 16379 # 必须比 port 大 10000,用于集群总线通信
改完后重启该节点:redis-cli -p 6379 shutdown → 再 redis-server redis.conf。别忘了对所有节点逐一操作。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 如果节点在不同云厂商或跨 VPC,确保它们之间 16379 端口互通(集群总线依赖它)
- 不要用
localhost或127.0.0.1—— Lettuce 会照字面解析并连接失败 - 若用域名(如
redis-node-a.example.com),需确认客户端 DNS 可解析且无缓存
Spring Boot 配置里哪些项关键?
application.yml 中重点不是“连哪个节点”,而是让 Lettuce 正确处理重定向:
spring:
data:
redis:
cluster:
nodes: 120.79.100.22:6379,120.79.100.23:6379,120.79.100.24:6379
max-redirects: 6
timeout: 3000
lettuce:
pool:
max-idle: 10
min-idle: 2
max-wait: 2000-
nodes列表填的是你「能主动连上的初始节点」,必须是公网 IP + 开放端口,且这些节点已正确配置cluster-announce-ip -
max-redirects建议设为集群主节点数(如 3 主 → 设 3,6 主 → 设 6),避免重定向链过长被截断 - 不用配
password在这里 —— 如果集群启用了密码,统一写在spring.data.redis.password,Lettuce 会自动透传到所有节点
验证是否绕过 NAT 成功?
最直接的办法:在 Spring Boot 应用机器上手动执行 redis-cli 连任意一个节点,然后打一个跨槽 key:
redis-cli -h 120.79.100.22 -p 6379 -a yourpass 120.79.100.22:6379> set user:1001 "hello" -> Redirected to slot [12345] located at 120.79.100.23:6379 OK
注意看第二行重定向目标 —— 它必须是你能 telnet 通的公网地址,而不是 10.x.x.x 或 172.x.x.x。
如果这里已经返回内网 IP,说明 cluster-announce-ip 没生效,或者 Redis 没 reload 配置;如果返回公网 IP 且 telnet 120.79.100.23 6379 通,那 Spring Boot 就大概率能连通。
真正容易被忽略的是:哪怕你把所有配置都写对了,只要有一个节点漏配 cluster-announce-ip,整个集群的拓扑通告就可能混乱 —— Lettuce 会从任意节点获取拓扑,而那个“坏节点”返回的错误地址会让后续请求全挂。

















