redisson 连接哨兵集群需严格匹配 mastername 和 sentineladdresses,yaml 配置须用 | 声明多行、sentineladdresses 带 redis:// 前缀、密码字段为 password;推荐使用 @configurationproperties 绑定配置而非手动 new config(),避免遗漏关键参数;连接后报 nonodeavailableexception 多因哨兵元数据未同步,应检查 +switch-master 日志、调小 scaninterval 或等待连接就绪。

直接用 redisson-spring-boot-starter + sentinelServersConfig 配置就能连上哨兵集群,但必须确保 masterName 和 sentinelAddresses 与实际 Redis 哨兵部署完全一致,否则会卡在连接初始化阶段、报超时或 NoConnectionAvailableException。
application.yml 中 sentinelServersConfig 的写法要点
Spring Boot 2.4+ 要求 YAML 多行字符串用 | 或 > 显式声明,否则缩进解析失败,导致 Config.fromYAML() 报 InvalidFormatException;sentinelAddresses 必须带 redis:// 协议前缀,不能只写 127.0.0.1:26379。
-
masterName必须和哨兵配置中sentinel monitor <master-name></master-name>的值严格一致(区分大小写) -
sentinelAddresses列表里每个地址都需是完整 URI,例如"redis://127.0.0.1:26379",缺协议或端口会静默忽略该节点 - 密码字段名是
password(不是sentinelPassword),且仅当哨兵本身设了认证才填;Redis 主从节点的密码另配在masterPassword/slavePassword(若不一致) - 如果使用 Spring Boot 3.x,注意
redisson-spring-boot-starter3.30.0+ 才完全兼容 Jakarta EE 9+,旧版会因类加载失败抛NoClassDefFoundError
为什么 new Config().useSentinelServers() 方式容易失败
手动 new Config() 并调用 useSentinelServers() 会绕过 Spring Boot 的自动配置生命周期,导致 RedissonClient 实例无法参与 Spring 管理(如无法被 @EventListener 监听连接事件、无法注入到 @Async 方法中),更关键的是:它不会读取 spring.redisson.config 下的 YAML 配置,所有参数都得硬编码,易遗漏 readMode、subscriptionMode 等影响读写分离行为的关键项。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 推荐始终走
@ConfigurationProperties("spring.redisson")绑定方式,让 starter 自动完成Config构建 - 若必须手写,务必显式设置
setReadMode(ReadMode.SLAVE)和setSubscriptionMode(SubscriptionMode.SLAVE),否则默认直连 master,失去哨兵的读写分离能力 -
addSentinelAddress(...)接收的是可变参数,但传入空数组或 null 会导致 NPE,应校验非空再调用
连接成功但 getBucket().get() 报错 NoNodeAvailableException
这通常不是配置问题,而是哨兵集群尚未完成故障转移后的元数据同步,或者客户端缓存了过期的 master 地址。Redisson 默认每秒轮询哨兵,但首次连接时若哨兵还没返回最新 master,就会尝试连一个已下线的地址。
- 检查哨兵日志是否出现
+switch-master,确认主从切换已完成 - 在
sentinelServersConfig中增加scanInterval: 500(单位毫秒),加快发现速度 - 避免在应用启动瞬间就执行 Redis 操作,加个
@PostConstruct+Thread.sleep(2000)等待连接就绪(仅限测试,生产应监听RedissonConnectionManager的onConnect事件) - 若 Redis 主节点启用了
replica-announce-ip,而哨兵配置里写的却是内网 IP,客户端可能连到不可达地址——此时要统一用容器网络 DNS 名或宿主机可路由的 IP
最常被忽略的是哨兵自身的 sentinel monitor 配置里写的 master 地址,必须能被 Redisson 客户端直接访问;很多人在 Docker 或 Kubernetes 里把哨兵指向了 Redis Pod 的 ClusterIP,却忘了客户端跑在外部网络,根本连不通那个地址。










