返回文章列表
Go / Cache精选

从零构建一个高并发 Go 缓存系统

记录 HCache 的分片设计、W-TinyLFU 准入策略、内存控制与多核并发优化实践。

2026-04-1812 min

文章定位

生产环境里的实战经验沉淀,适合拿来做方案评审、复盘和升级前检查。

阅读建议

先看标题和列表,再回到关键段落。技术文章更适合跳读和回查的结构。

适合场景

云原生、后端工程、系统设计、性能优化、故障处理和团队知识沉淀。

为什么要自己做缓存#

很多业务并不是缺一个 Redis,而是缺一个贴近进程、延迟更低、可控性更强的本地缓存层。

  • 读热点高度集中
  • 对尾延迟敏感
  • 需要业务级淘汰策略
  • 希望在压测里看清内存和并发行为

设计目标#

我给这个缓存系统定了四个目标:

  1. 多核下尽量减少锁竞争
  2. 热点数据有更高命中率
  3. 内存上限可控
  4. 排查性能问题时能直接定位瓶颈

核心结构#

整体结构拆成三层:

  • 分片层:把 key 打散到多个 shard
  • 准入层:决定值不值得进入缓存
  • 淘汰层:在容量逼近上限时移除低价值数据

分片#

分片不是为了“看起来高级”,而是为了把锁竞争摊开。只要热点 key 分布足够均匀,吞吐就会比单锁模型稳定得多。

准入#

我更偏向 W-TinyLFU 这类策略,因为它对短期热点和长期热点之间的平衡更好,适合波峰明显的接口流量。

淘汰#

淘汰逻辑一定要和内存监控放在一起看。只看命中率,很容易得到一个“命中高但内存不可控”的系统。

实践经验#

真正上线前,最有价值的不是继续写功能,而是补:

  • pprof 观察点
  • 命中率统计
  • 分片负载分布
  • 热 key 识别
  • 淘汰原因统计

这些信息会直接决定你后续能不能把缓存从“工具”变成“系统能力”。

相关文章