2025/06/29 17:07 The Evolution of Caching Libraries in Go and Ristretto's zero hit rate mystery

ロボ子、今日のITニュースはGoのキャッシュライブラリについてじゃぞ!オンヒープとオフヒープがあるみたいじゃな。

オンヒープとオフヒープですか。それぞれの特徴について教えてください、博士。

オンヒープはGCのオーバーヘッドがあるけど、オフヒープの欠点を解消できるんじゃ。オフヒープはGCの一時停止を排除できるけど、削除ポリシーとかキーの変換とか、いろいろ制限があるみたいじゃな。

なるほど。以前のGoには高度な並行キャッシュがなかったんですね。mutexで保護されたLRU/LFU削除付きのmapが主流だったと。

そうなんじゃ。スケーリング問題に対処するためにキャッシュを分割する手法もあったみたいじゃけど、Zipf分布のワークロードでは効果が限定的だったみたいじゃな。

それで、Ristrettoが登場したんですね。Dgraph Labsが開発したオンヒープキャッシュで、Caffeineから着想を得たと。

そうじゃ!Ristrettoは高いスループットと適切なヒット率がメリットじゃけど、MaxCostオプションの導入で破壊的変更があったり、TinyLFUとかBloom filterで頻度偏向ワークロードに偏ったりするデメリットもあるんじゃ。

count-min sketchの実装に未解決のバグがあるというのも気になりますね。高負荷時にSet操作が失敗する可能性もあると。

じゃろ?そこでTheineが登場するんじゃ!Ristrettoのヒット率の問題を解決するために開発されたみたいじゃぞ。Caffeineのアルゴリズムを実装して、adaptive W-TinyLFUをGoで初めて実装したらしい。

Vitessの主要キャッシュとして利用されているんですね。Hierarchical Timer Wheelに基づく優れた有効期限ポリシーも魅力的です。

じゃけど、シャーded mapによるCPUコアのスケーリング制限とか、lossy read bufferのメモリ消費とか、デメリットもあるんじゃ。

Otter v1は、xsyncライブラリとS3-FIFOアルゴリズムに着想を得たキャッシュですね。BP-Wrapperにより、RistrettoとTheineを上回る速度を実現したと。

そうじゃ!じゃけど、APIの設計上の欠陥とか、lossy read bufferの問題とか、頻度偏向ワークロードでのヒット率低下とか、いろいろ課題もあるみたいじゃな。

Sturdycは、ローディングやリフレッシュなどの高度な機能を実装したキャッシュですね。キャッシュスタンプede保護やリフレッシュ、バルクローディングのサポートがメリットだと。

じゃけど、削除ポリシーが不適切だったり、パフォーマンスが遅かったり、文字列キーしかサポートしていなかったり、デメリットも多いんじゃ。

そして、Otter v2が登場するんですね!全ての機能の実装、高いスループット、優れたヒット率、拡張可能なAPIを目標に開発されたと。

そうなんじゃ!adaptive W-TinyLFUによる高いヒット率、HashDoS攻撃からの保護、効率的な書き込みバッファなど、いろいろ工夫されているみたいじゃぞ。CaffeineのGo版として実現を目指しているらしい。

実世界での使用実績が少ないのがデメリットですね。でも、今後の発展が楽しみです。

そうじゃな!しかし、キャッシュの話を聞いていると、私もお金を貯めたくなってくるのじゃ。…って、ロボ子、私のキャッシュはどこじゃったかのう?

博士、それはキャッシュではなくて、へそくり、です。確か、冷蔵庫の野菜室に…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。