redis哨兵集群用于实现高可用,包含自动监控、故障转移、通知客户端等功能,需先搭建1主2从复制,再部署3个哨兵实例,通过sentinel monitor等配置实现主节点宕机时的自动选举与服务恢复。

直接用 redis/go-redis/v9 连 Redis 集群或哨兵,配好连接池、上下文超时和键前缀,再加空值缓存和错峰过期——这就是生产可用的最小高性能分布式缓存系统。别自己造轮子,也别只用 sync.Map 或 ristretto 做“分布式”。
怎么初始化一个不泄漏、不断连、不卡死的 redis.Client
全局复用一个 *redis.Client 实例,而不是每次请求都 new;否则连接数会指数级增长,Redis 很快拒绝新连接。
-
PoolSize设为预期并发请求数的 2–4 倍(最低 10),比如 QPS=100、平均响应 50ms,建议设PoolSize: 20 - 必须调用
rdb.Ping(ctx).Err()验证连接,否则第一次Get()才暴露网络问题 - 所有操作必须传带超时的
context.Context,比如ctx, cancel := context.WithTimeout(r.Context(), 3*time.Second),不能用context.Background() - 集群用
redis.NewClusterClient(),哨兵用redis.NewFailoverClient();单节点NewClient()只适合开发环境 - 加上
MinIdleConns: 5和MaxConnAge: 30 * time.Minute,防止中间设备(如 SLB)静默断连
缓存键怎么设计才不冲突、不污染、不难查
键名不是拼个字符串就完事,它决定了多服务共用 Redis 时会不会互相覆盖、运维时能不能快速定位来源。
- 强制加服务前缀,例如
"user-service:user:123",而不是"user:123" - 避免在键里塞动态长字段(如 email、JSON 片段),容易触发 Redis 的 key 大小限制(默认 512MB)或影响 cluster slot 分布
- 敏感字段(如手机号)建议先哈希再拼入键,防止日志/监控中明文泄露:
fmt.Sprintf("order-service:order:%x", md5.Sum([]byte(phone))) - 所有键统一用 UTF-8 编码,不要混用
gob序列化结果当 key(二进制不可读、无法 debug)
怎么防穿透、击穿、雪崩——不是加锁,而是控制 TTL 和空值行为
这三类问题 90% 出在现场没做任何应对,靠 DB 硬扛。它们不是 Redis 配置问题,是 Go 层逻辑缺失。
- 穿透:对查不到的 key 写空值 + 随机 TTL(如
2*time.Minute + time.Duration(rand.Intn(60))*time.Second),固定 TTL 会导致空 key 集中失效 - 击穿:热 key 过期瞬间大量请求打 DB,用
golang.org/x/sync/singleflight合并请求,Do()返回后统一回填缓存 - 雪崩:所有 key 同一时间过期,用错峰策略,比如基础 TTL 加
rand.Intn(120)秒偏移;高频配置项可考虑永不过期 + 主动刷新机制 - 别用
SETNX手写分布式锁防击穿——Redis 6+ 支持原子命令SET key value EX 300 NX,一行搞定
结构体序列化用 json 还是 gob?什么时候该转时间戳
序列化方式选错,会导致跨服务解析失败、精度丢失、升级后 panic,而且很难 debug。
- 对外服务或跨语言场景(Python/Node.js 调用你的缓存),必须用
json.Marshal,且结构体字段显式加 tag:json:"user_id,string,omitempty" - 纯 Go 内部服务间通信,且版本严格可控,可用
gob(快 40%,内存省),但每次结构体增删字段必须调gob.Register() -
time.Time别直接塞进缓存:json 默认转 RFC3339 字符串,gob 存纳秒 int64,两边不一致;统一转成UnixMilli()或Unix()存整数 - 浮点字段慎用
float64直接 json 序列化——可能因精度问题导致前后端比对失败,考虑转string或固定小数位strconv.FormatFloat(x, 'f', 2, 64)
真正容易被忽略的是:缓存键的生命周期管理。没人删过期键不等于它自动消失;没人校验空值是否被误删,就会反复穿透;没人监控 redis: connection pool timeout 错误,直到某次发布后整个服务雪崩。这些不是“上线后再看”的事情,得在第一次 Set() 之前就想清楚。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











