必须用redis.newfailoverclient而非newclient,因为哨兵只响应sentinel指令、不处理get等redis命令,newclient直连哨兵地址会因协议不匹配报err unknown command 'get';newfailoverclient则自动与哨兵通信获取主节点并监听故障转移事件。

为什么用 redis.NewFailoverClient 而不是 redis.NewClient
因为哨兵(Sentinel)模式下,Redis 主节点可能随时切换,redis.NewClient 只能连固定地址,一旦主节点漂移就会报 redis: nil 或 connection refused。而 redis.NewFailoverClient 会主动向 Sentinel 查询当前主节点地址,并在主从切换后自动重连新主——这是它和普通客户端的本质区别。
常见错误是直接拿哨兵地址当 Redis 地址去连:redis.NewClient(&redis.Options{Addr: "sentinel1:26379"}),这根本连不上 Redis,只连了哨兵服务本身(它不响应 Redis 协议)。
初始化 redis.FailoverOptions 的关键字段怎么填
必须显式指定哨兵地址、主节点名、密码(如有),否则客户端无法定位主库:
-
MasterName:不是 Redis 实例名,而是你在 Sentinel 配置里通过sentinel monitor <master-name> ...</master-name>定义的那个名字,比如myapp-master -
SentinelAddrs:传哨兵集群地址列表,如[]string{"sentinel1:26379", "sentinel2:26379", "sentinel3:26379"};不能只写一个,否则哨兵挂掉一个就失联 -
Password:如果 Redis 主从实例设置了requirepass,这里填 Redis 密码;不是哨兵密码(哨兵默认无认证) -
SentinelPassword:仅当哨兵自己启用了requirepass才需要填(较少见)
示例初始化:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
client := redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: "myapp-master",
SentinelAddrs: []string{"10.0.1.10:26379", "10.0.1.11:26379", "10.0.1.12:26379"},
Password: "redis-secret",
})
连接失败时该检查哪些地方
典型错误信息如 redis: all sentinels are unreachable 或 redis: failed to get master from sentinel,优先排查以下几点:
- 确认哨兵进程运行中,且
redis-cli -p 26379 sentinel masters能返回主节点信息(注意端口是26379,不是6379) - 检查 Go 应用与哨兵之间的网络连通性(防火墙、安全组、Pod 网络策略)
- 核对
MasterName是否和sentinel monitor命令中定义的完全一致(大小写、下划线) - 如果 Redis 主从启用了 TLS,
redis.NewFailoverClient默认不支持;需手动配置Dialer并传入*tls.Config,否则握手失败静默超时
哨兵模式下 Ping() 和 Do() 的行为差异
client.Ping().Err() 检查的是到当前主节点的连通性,不是哨兵;但首次调用时会触发哨兵查询逻辑,所以第一次 Ping 可能稍慢(约几百毫秒)。如果后续主节点切换,Ping 会自动指向新主,无需重启应用。
要注意:client.Do(ctx, "INFO", "replication").Val() 返回的是当前主节点的 info,不是哨兵的。想查哨兵状态得直连哨兵用 redis.NewClient(&redis.Options{Addr: "sentinel:26379"}) 单独发 SENTINEL MASTER myapp-master。
真正容易被忽略的是:哨兵发现主节点变更后,客户端不会立刻中断现有连接,而是等下次命令执行时才重试新主。这意味着正在执行的长耗时命令(如 SCAN)可能仍在旧主上跑完,不会自动迁移——这不是 bug,是设计使然。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










