Go语言怎么做分布式缓存_Go语言分布式缓存教程【经典】

张开发
2026/4/19 5:55:29 15 分钟阅读

分享文章

Go语言怎么做分布式缓存_Go语言分布式缓存教程【经典】
用 redis.Client 连集群或哨兵而非单节点哨兵用 NewFailoverClient 并传 MasterName 和全部哨兵地址集群用 NewClusterClient 并设 Timeout 与 MaxRetries。用 redis.Client 连集群还是单节点别硬套文档示例Go 里最常踩的坑是一上来就照抄 redis.NewClient 连单机结果上线后缓存雪崩或超时频发——因为生产环境基本都是 Redis 集群或哨兵。单节点客户端不自动重试、不感知故障转移redis.FailoverOptions 或 redis.ClusterOptions 才是真入口。哨兵场景用 redis.NewFailoverClient必须显式传 MasterName 和哨兵地址列表漏掉任意一个哨兵地址会导致初始化失败集群模式用 redis.NewClusterClient节点列表只需填几个比如 2–3 个它会自动发现其余节点但首次连接任一节点失败整个 client 就 panic得包一层 if err ! nil所有连接都建议设 Timeout: 3 * time.Second 和 MaxRetries: 2否则网络抖动时请求直接卡死在 ctx.Done()Set 和 SetNX 性能差多少看是否带过期时间很多人以为 SetNX 天然比 Set 慢其实关键在参数如果 Set 带了 EX 或 PX底层走的是 SET key value EX seconds 单命令而 SetNX 默认不设过期真要原子性“不存在才写带过期”得用 Set 的 XX/NX 选项组合。client.Set(ctx, k, v, 30*time.Second) → 单次 RTT快client.SetNX(ctx, k, v, 0) → 不设过期后续还得 Expire两次 RTT且非原子真正需要“存在不覆盖带过期”时用 client.Set(ctx, k, v, redis.SetArgs{NX: true, Ex: 30})结构体存 json.Marshal 还是 gob先看跨语言需求Go 缓存结构体时json.Marshal 是默认选择但它有隐性成本字段名转小写、空值被忽略、浮点精度丢失gob 快且保真但只限 Go 进程间通信——一旦下游是 Python 或 Node.js 服务反序列化直接报错。纯 Go 微服务内部用 gob序列化快 40%内存占用低但注意 gob 不兼容结构体字段增删版本升级需加 gob.Register多语言或对外 API 场景必须用 json且结构体字段加 json:field_name,omitempty 控制输出避免空字符串/零值污染缓存别把 time.Time 直接塞进去——json 默认转 RFC3339 字符串gob 存纳秒整数两边解析逻辑不一致统一转成 int64 时间戳再存本地缓存 Redis 双写怎么防 cache stampede本地缓存比如 freecache和 Redis 联用时热点 key 过期瞬间大量请求穿透到 DB不是靠加锁就能解决的——锁只拦住同进程请求跨实例照样打穿 DB。 Ideogram Ideogram是一个全新的文本转图像AI绘画生成平台擅长于生成带有文本的图像如LOGO上的字母、数字等。

更多文章