必须用redis.newclusterclient()而非newclient(),因后者不支持集群拓扑发现、moved/ask重定向及自动槽位刷新;初始化后须立即ping校验连接,addrs至少填2–3个主节点地址且不可含从节点。

直接用 redis.NewClient() 连 Redis Cluster,90% 的请求会卡在 MOVED 或 ASK 错误上,然后 panic 或无限阻塞。必须用 redis.NewClusterClient(),它才真正理解集群拓扑、自动刷新槽位映射、处理重定向和故障转移。
为什么 NewClusterClient 初始化后还要主动 Ping
redis.NewClusterClient() 构造函数不校验连接,只返回一个 client 实例。集群地址错、密码错、节点宕机、槽位未分配……这些全在初始化阶段就决定了,但你根本不知道。
必须在创建 client 后立刻调一次 rdb.Ping(ctx).Err(),带超时 context:
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
if err := rdb.Ping(ctx).Err(); err != nil {
log.Fatal("failed to connect to redis cluster:", err)
}
漏掉这步,第一个 Get 或 Set 才暴露问题,线上排查成本翻倍。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
Addrs 填什么、填几个、能不能填从节点
Addrs 是起点,不是全部节点列表。客户端靠它发起 CLUSTER SLOTS 拉取完整拓扑,所以:
- 至少填 2–3 个主节点地址(如
[]string{"10.0.1.1:6379", "10.0.1.2:6379"}),别只写一个 —— 第一个连不上就失败,不会自动试下一个 - 绝对不要填从节点地址(replica)—— 它默认不响应
CLUSTER SLOTS,初始化直接卡住或报错 - 地址格式必须是
host:port,不能带redis://前缀,也不能带数据库号(DB: 1会被忽略,还容易误导)
连接池、超时、读写分离怎么配才不翻车
默认配置在生产环境极易出问题:
-
PoolSize默认 10,是「每个已知节点」都开 10 条连接。5 节点集群就是 50 条,QPS 上千时很快触发redis: connection pool timeout;建议按公式设:预估 QPS × 2 ÷ 节点数,单节点上限别超 200 -
MaxConnAge必须设(如30 * time.Minute),否则 NAT 或防火墙静默断连后出现write: broken pipe -
ReadOnly默认 false,若业务需读从节点,得显式设为 true,且确保 Redis 配置了slave-read-only no或用 Redis 6+ 的READONLY命令支持 -
RouteByLatency或RouteRandomly必须二选一显式设置,否则读请求永远只打第一个 master,负载严重倾斜
CROSSSLOT 和 Lua 脚本的硬限制绕不开
Redis Cluster 协议层强制约束,不是客户端能绕过的:
-
MGET、DEL、PIPELINE等多 key 命令,所有 key 必须落在同一 slot,否则直接返回redis: CROSSSLOT Keys in request don't hash to the same slot - 强制同 slot 的唯一可靠方式是用哈希标签:
{user:1001}:profile和{user:1001}:settings→ 大括号内内容决定 slot - Lua 脚本里操作多个 key,也必须保证它们同 slot;否则
EVAL直接失败。脚本中不能用KEYS[1]和KEYS[2]指向不同业务前缀的 key
最常被忽略的一点:client.KeySlot(key) 是调试利器,上线前务必用它验证关键 key 的槽位分布,而不是靠猜测或日志拼凑。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










