返回顶部
g

golang-samber-hotsamber-hot内存缓存

In-memory caching in Golang using samber/hot — eviction algorithms (LRU, LFU, TinyLFU, W-TinyLFU, S3FIFO, ARC, TwoQueue, SIEVE, FIFO), TTL, cache loaders, sharding, stale-while-revalidate, missing key caching, and Prometheus metrics. Apply when using or adopting samber/hot, when the codebase imports github.com/samber/hot, or when the project repeatedly loads the same medium-to-low cardinality resources at high frequency and needs to reduce latency or backend pressure.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.1
安全检测
已通过
121
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

golang-samber-hot

角色定位: 你是一位将缓存视为系统设计决策的 Go 工程师。你根据测量到的访问模式选择淘汰算法,根据工作集数据确定缓存大小,并始终为过期、加载器故障和监控做好规划。

在 Go 中使用 samber/hot 进行内存缓存

适用于 Go 1.22+ 的通用、类型安全的内存缓存库,提供 9 种淘汰算法、TTL、带单飞去重的加载器链、分片、stale-while-revalidate 以及 Prometheus 指标。

官方资源:

本技能并非详尽无遗。请参考库文档和代码示例以获取更多信息。Context7 可作为发现平台提供帮助。

bash
go get -u github.com/samber/hot

算法选择

根据你的访问模式进行选择——错误的算法会浪费内存或降低命中率。

算法常量最佳适用场景应避免的场景
W-TinyLFUhot.WTinyLFU通用型,混合工作负载(默认)你需要简单性以便调试
LRU
hot.LRU | 最近访问主导(会话、近期查询) | 频率很重要(扫描污染会淘汰热点项) |
| LFU | hot.LFU | 访问频率主导(热门产品、DNS) | 访问模式会变化(过时的热门项永远不会被淘汰) |
| TinyLFU | hot.TinyLFU | 读密集且偏向频率 | 写密集(准入过滤器开销) |
| S3FIFO | hot.S3FIFO | 高吞吐量,抗扫描 | 小型缓存(<1000 项) |
| ARC | hot.ARC | 自适应,未知模式 | 内存受限(2 倍跟踪开销) |
| TwoQueue | hot.TwoQueue | 混合冷热分离 | 调优复杂性不可接受 |
| SIEVE | hot.SIEVE | 简单的抗扫描 LRU 替代方案 | 高度倾斜的访问模式 |
| FIFO | hot.FIFO | 简单、可预测的淘汰顺序 | 命中率很重要(无频率/最近访问感知) |

决策捷径: 从 hot.WTinyLFU 开始。仅当性能分析显示未命中率对你的 SLO 过高时才切换。

有关详细的算法比较、基准测试和决策树,请参阅 算法指南

核心用法

带 TTL 的基本缓存

go
import github.com/samber/hot

cache := hot.NewHotCachestring, *User.
WithTTL(5 * time.Minute).
WithJanitor().
Build()
defer cache.StopJanitor()

cache.Set(user:123, user)
cache.SetWithTTL(session:abc, session, 30*time.Minute)

value, found, err := cache.Get(user:123)

加载器模式(穿透读取)

加载器自动获取缺失的键,并带有单飞去重——对同一缺失键的并发 Get() 调用共享一次加载器调用:

go
cache := hot.NewHotCacheint, *User.
WithTTL(5 * time.Minute).
WithLoaders(func(ids []int) (map[int]*User, error) {
return db.GetUsersByIDs(ctx, ids) // 批量查询
}).
WithJanitor().
Build()
defer cache.StopJanitor()

user, found, err := cache.Get(123) // 未命中时触发加载器

容量规划

在设置缓存容量之前,估算在内存预算内能容纳多少项:

  1. 1. 估算单条项大小——估算结构体大小,加上堆分配字段(切片、映射、字符串)的大小。包含键的大小。每条项约 100 字节的粗略开销涵盖了内部记账(指针、过期时间戳、算法元数据)。
  2. 询问开发者在生产环境中为此缓存分配了多少内存(例如 256 MB、1 GB)。这取决于服务的总内存以及共享该进程的其他内容。
  3. 计算容量——容量 = 内存预算 / 估算项大小。向下取整以留出余量。

示例:*User 结构体 ~500 字节 + 字符串键 ~50 字节 + 开销 ~100 字节 = 约 650 字节/项
256 MB 预算 → 256000000 / 650 ≈ 393,000 项

如果项大小未知,请让开发者通过一个分配 N 项并检查 runtime.ReadMemStats 的单元测试来测量。未经测量就猜测容量会导致 OOM 或内存浪费。

常见错误

  1. 1. 忘记 WithJanitor()——没有它,过期条目会一直留在内存中,直到算法将其淘汰。始终在构建器中链式调用 .WithJanitor() 并 defer cache.StopJanitor()。
  2. 在未配置缺失缓存的情况下调用 SetMissing()——运行时 panic。先在构建器中启用 WithMissingCache(algorithm, capacity) 或 WithMissingSharedCache()。
  3. WithoutLocking() + WithJanitor()——互斥,会 panic。WithoutLocking() 仅在没有后台清理的单 goroutine 访问场景下安全。
  4. 缓存过大——容纳所有内容的缓存就是一个带有开销的 map。根据你的工作集大小进行规划(通常占总数据的 10-20%)。监控命中率以验证。
  5. 忽略加载器错误——加载器失败时 Get() 返回 (zero, false, err)。始终检查 err,而不仅仅是 found。

最佳实践

  1. 1. 始终设置 TTL——无界缓存会无限期地提供过期数据,因为没有刷新信号
  2. 使用 WithJitter(lambda, upperBound) 分散过期时间——没有抖动,同时创建的项会同时过期,导致加载器上的惊群效应
  3. 使用 WithPrometheusMetrics(cacheName) 进行监控——命中率低于 80% 通常意味着缓存大小不足或算法不适合工作负载
  4. 对可变值使用 WithCopyOnRead(fn) / WithCopyOnWrite(fn)——没有副本,调用者会修改缓存对象并破坏共享状态

有关高级模式(重新验证、分片、缺失缓存、监控设置),请参阅 生产模式

有关完整的 API 接口,请参阅 API 参考

如果你在 samber/hot 中遇到错误或意外行为,请在 https://github.com/samber/hot/issues 提交问题。

交叉引用

  • - -> 有关通用缓存策略以及何时使用内存缓存 vs Redis vs CDN,请参阅 samber/cc-skills-golang@golang-performance 技能
  • -> 有关 Prometheus 指标集成和监控,请参阅 samber/cc-skills-golang@golang-observability 技能
  • -> 有关与缓存加载器配合使用的数据库查询模式,请参阅 samber/cc-skills-golang@golang-database 技能
  • -> 有关通过 CLI 查询 Prometheus 缓存指标,请参阅 samber/cc-skills@promql-cli 技能

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 golang-samber-hot-1776057803 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 golang-samber-hot-1776057803 技能

通过命令行安装

skillhub install golang-samber-hot-1776057803

下载

⬇ 下载 golang-samber-hot v1.0.1(免费)

文件大小: 17.04 KB | 发布时间: 2026-4-14 13:49

v1.0.1 最新 2026-4-14 13:49
- Version bump to 1.0.1 in metadata.
- Added evals/evals.json (new file for skill evaluation configuration).
- No changes to skill content or instructions—documentation unchanged.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部