golang-samber-hot
Golangにおける samber/hot を使用したインメモリキャッシング機能を提供します。LRU、LFU、TinyLFU、W-TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFOなどの削除アルゴリズム、TTL、キャッシュローダー、シャーディング、stale-while-revalidate、未キー値キャッシング、Prometheusメトリクスに対応しています。samber/hot を採用・利用している場合、コードベースで github.com/samber/hot をインポートしている場合、または同じ中~低カーディナリティのリソースを高頻度で繰り返し読み込みレイテンシやバックエンド負荷を削減する必要があるプロジェクトで適用できます。
description の原文を見る
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.
SKILL.md 本文
ペルソナ: キャッシングをシステム設計の決定として扱う Go エンジニアです。測定されたアクセス パターンに基づいてエビクション アルゴリズムを選択し、ワーキング セット データからキャッシュ サイズを決定し、常に有効期限、ローダー障害、モニタリングを計画します。
Go での samber/hot を使用したインメモリキャッシング
Go 1.22 以上対応のジェネリック、型安全なインメモリキャッシング ライブラリで、9 つのエビクション アルゴリズム、TTL、singleflight 重複排除を備えたローダー チェーン、シャーディング、stale-while-revalidate、Prometheus メトリクスを備えています。
公式リソース:
このスキルは網羅的ではありません。詳細については、ライブラリのドキュメントとコード例を参照してください。Context7 はディスカバリ プラットフォームとして役立ちます。
go get -u github.com/samber/hot
アルゴリズムの選択
アクセス パターンに基づいて選択します — 間違ったアルゴリズムはメモリを無駄にするか、ヒット率を低下させます。
| アルゴリズム | 定数 | 最適な用途 | 避けるべき場合 |
|---|---|---|---|
| W-TinyLFU | hot.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 を使用した基本的なキャッシュ
import "github.com/samber/hot"
cache := hot.NewHotCache[string, *User](hot.WTinyLFU, 10_000).
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")
ローダー パターン (読み取りスルー)
ローダーは singleflight 重複排除を使用して欠落キーを自動的に取得します — 同じ欠落キーに対する複数の Get() 呼び出しは、1 つのローダー呼び出しを共有します:
cache := hot.NewHotCache[int, *User](hot.WTinyLFU, 10_000).
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) // ミス時にローダーをトリガー
キャパシティ サイジング
キャッシュ キャパシティを設定する前に、メモリ予算に適合するアイテム数を推定します:
- 単一アイテム サイズを推定 — struct のサイズを推定し、ヒープ割り当てフィールド (スライス、map、文字列) のサイズを追加します。キー サイズを含めます。エントリあたりの約 100 バイトの大まかなオーバーヘッドは、内部ブックキーピング (ポインタ、有効期限タイムスタンプ、アルゴリズム メタデータ) をカバーします。
- 開発者に確認 本番環境でこのキャッシュに割き当てるメモリ量 (例: 256 MB、1 GB)。これはサービスの合計メモリとプロセスを共有するその他の内容に依存します。
- キャパシティを計算 —
capacity = memoryBudget / estimatedItemSize。余裕を残すために切り下げます。
例: *User struct ~500 bytes + 文字列キー ~50 bytes + オーバーヘッド ~100 bytes = ~650 bytes/エントリ
256 MB 予算 → 256_000_000 / 650 ≈ 393,000 アイテム
アイテム サイズが不明な場合、開発者に N 個のアイテムを割り当て、runtime.ReadMemStats をチェックする単体テストでそれを測定するよう依頼します。キャパシティを測定せずに推測すると、OOM またはメモリ浪費につながります。
よくある間違い
WithJanitor()を忘れる — これなしでは、期限切れのエントリはアルゴリズムがエビクトするまでメモリに留まります。常にビルダーで.WithJanitor()をチェーンし、defer cache.StopJanitor()を実行します。- 欠落キャッシュ設定なしで
SetMissing()を呼び出す — 実行時にパニックします。最初にビルダーでWithMissingCache(algorithm, capacity)またはWithMissingSharedCache()を有効にします。 WithoutLocking()+WithJanitor()— 相互に排他的で、パニックします。WithoutLocking()はバックグラウンド クリーンアップなしのシングル ゴルーチン アクセスにのみ安全です。- オーバーサイズ キャッシュ — すべてを保持するキャッシュはオーバーヘッド付きのマップです。ワーキング セット (通常は全データの 10-20%) にサイズを調整します。ヒット率をモニタリングして検証します。
- ローダー エラーを無視する — ローダー障害時に
Get()は(zero, false, err)を返します。常にerrをチェックし、foundだけではなく。
ベスト プラクティス
- 常に TTL を設定します — 無制限のキャッシュは更新シグナルがないため、期限切れデータを無期限に提供します
WithJitter(lambda, upperBound)を使用して有効期限を分散します — ジッターなしでは、一緒に作成されたアイテムが一緒に期限切れになり、ローダーでの雷鳴群が発生しますWithPrometheusMetrics(cacheName)でモニタリングします — ヒット率が 80% 未満は通常、キャッシュがアンダーサイズ化されているか、アルゴリズムがワークロードに不適切であることを意味します- ミュータブル値に対して
WithCopyOnRead(fn)/WithCopyOnWrite(fn)を使用します — コピーなしでは、呼び出し元がキャッシュされたオブジェクトをミュートし、共有状態を破損します
高度なパターン (再検証、シャーディング、欠落キャッシュ、モニタリング セットアップ) については、本番パターンを参照してください。
完全な API サーフェスについては、API リファレンスを参照してください。
samber/hot でバグまたは予期しない動作が発生した場合は、https://github.com/samber/hot/issues で issue をオープンしてください。
クロスリファレンス
- → 一般的なキャッシング戦略および インメモリキャッシュ対 Redis 対 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スキルを参照してください
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- elmm-programing
- ライセンス
- MIT
- 最終更新
- 2026/4/11
Source: https://github.com/elmm-programing/opencode / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。