spring boot连接redis哨兵模式必须配置spring.redis.sentinel.master和spring.redis.sentinel.nodes,前者需与sentinel.conf中sentinel monitor定义的master名称严格一致(如mymaster),后者须为应用可直连的哨兵ip:端口列表(如192.168.43.243:26379),禁用localhost/127.0.0.1,且多个节点用英文逗号分隔、无空格。

spring.redis.sentinel.master 和 spring.redis.sentinel.nodes 是 Spring Boot 自动配置 Redis 哨兵模式的两个必须项,缺一不可。Spring Boot 2.0+(基于 Lettuce 或 Jedis)会用它们初始化 RedisSentinelConfiguration,进而构建高可用连接工厂。填错或漏填,应用启动时不会报错,但运行时会连不上主节点,表现为超时或 Cannot connect to sentinel 类错误。
sentinel.master 必须和哨兵实际监控的 master 名称完全一致
这个值不是你随便起的,而是你在 sentinel.conf 中用 sentinel monitor 指令定义的名称:
sentinel monitor mymaster 192.168.43.243 6379 2
上面这行里 mymaster 就是 master 的值。常见错误包括:
- 大小写不一致(如配置成
Mymaster或MYMASTER) - 多空格或不可见字符(YAML 中尤其容易因缩进混入全角空格)
- 与哨兵日志中打印的
+monitor事件不匹配(可通过redis-cli -p 26379 sentinel masters实时验证)
sentinel.nodes 必须是可直连的哨兵地址,且不能含 localhost/127.0.0.1
Spring Boot 启动后,会向每个 nodes 地址发起 TCP 连接,获取当前主节点信息。如果填了 127.0.0.1:26379,而你的应用部署在另一台机器上,就会连到自己本地——但本地根本没跑哨兵进程。
正确写法示例(YAML):
spring:
redis:
sentinel:
master: mymaster
nodes: 192.168.43.243:26379,192.168.43.244:26379,192.168.43.245:26379
注意事项:
- 多个节点用英文逗号分隔,前后不能有空格(
192.168.1.1:26379 , 192.168.1.2:26379会解析失败) - 地址必须是应用服务器能直接访问的 IP + 端口,Docker 环境下注意宿主机网络模式与端口映射是否生效
- 不需要也不应该包含主从 Redis 节点地址(如
6379端口),只填哨兵的26379等端口
password 和 database 需要按场景显式配置
如果 Redis 主从启用了密码(requirepass),必须配 spring.redis.password;如果哨兵本身也设了密码(sentinel auth-pass),则需额外配 spring.redis.sentinel.password(Spring Boot 2.3+ 支持)。database 默认是 0,若主节点用了非 0 库,必须通过 spring.redis.database 显式指定,否则读写会落到默认库,导致键找不到。
典型组合:
spring:
redis:
password: redis123
database: 1
sentinel:
master: mymaster
nodes: 192.168.43.243:26379,192.168.43.244:26379
password: sentinel456 # 仅当哨兵启用了 auth-pass 时才需要
自动故障转移后连接池不会立即刷新主节点地址
这是最容易被忽略的「黑盒行为」:哨兵完成主从切换后,新主节点 IP 变了,但 Spring Boot 内部的 Lettuce 连接池仍缓存着旧主地址,后续请求可能持续失败几十秒甚至更久,直到连接池重建或健康检查触发刷新。
缓解方式只有两个:
- 确保
LettuceClientConfigurationBuilderCustomizer中启用了clientOptions的autoReconnect(true)和cancelCommandsOnReconnectFailure(false) - 在生产环境强制配置合理的
spring.redis.lettuce.pool.time-between-eviction-runs(如 30s),让连接池定期探活并剔除失效连接
单纯依赖“哨兵自动发现”并不够——它只管初始化,不管运行时动态更新。











