生产环境必须用redis.newfailoverclient(哨兵)或redis.newclusterclient(集群),禁用newclient;哨兵需传全哨兵地址和mastername,集群只需2–3个节点地址并自动发现;所有客户端须设timeout和maxretries;空值占位、ttl扰动、序列化一致性、本地缓存预热及连接池合理配置是高可用关键。

生产环境的分布式缓存从来不是“连上 Redis 就完事”——高可用是设计出来的,不是配置出来的。
redis.NewClient 不能用于生产集群
用 redis.NewClient 连 Redis 集群或哨兵,等于裸奔。它不感知节点故障、不自动重试、不发现新节点,一次网络抖动就卡死在 ctx.Done()。真正该用的是:redis.NewFailoverClient(哨兵)或 redis.NewClusterClient(Redis Cluster)。
- 哨兵模式必须传
MasterName和**全部**哨兵地址,漏一个,NewFailoverClient初始化直接失败 - 集群模式只需提供 2–3 个节点地址,客户端会自动
CLUSTER NODES发现其余节点;但首次连接任一节点失败,整个 client 构造就会 panic,必须包一层if err != nil - 所有客户端都得设
Timeout: 3 * time.Second和MaxRetries: 2,否则超时请求会堆积阻塞 goroutine
空值占位和 TTL 扰动是防雪崩/穿透的底线
缓存击穿和雪崩不是 Redis 的问题,是 Go 层没兜住。查不到数据时,不能让请求直冲 DB;大量 key 同一时刻过期,也不能指望 DB 抗住峰值。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 对不存在的 key,
client.Get(ctx, key)返回redis.Nil,此时应client.Set(ctx, key, "null", 1*time.Minute)占位,后续读到"null"就跳过 DB - TTL 别写死:用
baseTTL := 10 * time.Minute+jitter := time.Duration(rand.Int63n(int64(2 * time.Minute))),再传给Set;注意别在全局 init 里初始化rand,要用rand.New(rand.NewSource(time.Now().UnixNano()))每次生成独立实例 - 别用
SETNX手动实现布隆过滤器——小项目用空值占位+短 TTL 更稳;大流量场景才考虑github.com/yourbasic/bloom
结构体序列化选 json 还是 gob?看上下游是不是纯 Go
缓存结构体不是“能存进去就行”,反序列化一致性才是线上事故高发点。
- 跨语言或对外服务:必须用
json.Marshal,且结构体字段加json:"field_name,omitempty"控制输出;避免空字符串、零值污染下游 - 纯 Go 微服务内部:优先用
gob,快 40%、内存低、保真度高;但要注意gob.Register必须在程序启动时调用,且字段增删不兼容(升级需灰度或双写) -
time.Time统一转成int64时间戳再存,否则json存 RFC3339 字符串、gob存纳秒整数,不同模块解析结果不一致
本地缓存 + Redis 双写时,cache stampede 不靠单机锁解决
用 freecache 或 bigcache 做本地缓存,配合 Redis 做二级缓存,热点 key 过期瞬间,单机锁拦不住跨实例并发请求,DB 照样被打穿。
- 本地缓存过期前,提前 100–500ms 主动刷新(refresh ahead),避免集中失效
- Redis 层用
SET key value EX 600 NX配合随机 jitter,让多个实例竞争写入,只让一个成功回源,其余等待并读取新值 - 更稳妥的做法是引入分布式锁(如 Redis 的
SET key val EX 30 NX),但锁粒度要细,别锁整个业务类型,按 key 分片加锁
真实压测里最常被忽略的一点:连接池大小不是拍脑袋定的。PoolSize 要根据 QPS、平均 RT 和 Redis 实例规格算——比如 QPS=2000、RT=5ms,理论最小连接数 ≈ 2000 × 0.005 = 10,但得留 2–3 倍余量,最终设成 20–30 更稳。设小了连接争抢,设大了又浪费 fd 和内存。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










