cloverrose's blog

Python, Machine learning, Emacs, CI/CD, Webアプリなど

in-memoryなcache libraryをさっと調べた

要件

GRPC endpointへの負荷を減らすために、結果をキャッシュしたい。

複数の関数からは参照されないので、Cache objectを適切なStruct内に持っていてSet/Getを呼べれば充分。

必須な要件

  • TTLを設定できて自動的にExpireしたEntryを削除してくれる
  • Thread safe

あったらいいなの要件

  • 充分メンテナンスされている
  • Starが多い
  • Codeがシンプルで無駄な機能がない
  • 簡単に使いたいのでEntryにDeSerialize掛けくて直にSet/Getできる
  • 簡単に使いたいのでDefault TTLを設定できる
  • Valueの型をGenerics的に指定できて、GetしたValueの型Castしなくていい
  • Entryの最大数を設定できて、もし予想外にEntryを追加されてメモリを圧迫しないようにできる
  • Cache hitしなかったときにCallback関数の結果を格納する
    • 自前でLockしなくても同じタイミングでCache missしたときに複数プロセスが重い処理をしないことが保証できるのがいいな

なくてもいい機能

  • KeyごとにTTL変える必要はない
  • 多数のEntryを管理できなくていい
  • Entry数は充分小さいので凝ったReplacement policy (LRUなど)はなくてもいい
  • KeyはString型なので任意の型をKeyに使えなくても良い

選んだLibrary

要件がかなりシンプルなので、充分なシンプルなLibraryでコードを読んで理解できるものを選んだ。

GitHub - patrickmn/go-cache: An in-memory key:value store/cache (similar to Memcached) library for Go, suitable for single-machine applications.github.com

コードがかなりシンプルでどこでLockかけているかとか、いつExpireした結果が消されるかが理解しやすい。

探したときのメモ

GitHub - eko/gocache: ☔️ A complete Go cache library that brings you multiple ways of managing your cachesのMemory Storeでサポートされているライブラリとかも良さそう

GitHub - avelino/awesome-go: A curated list of awesome Go frameworks, libraries and softwareでcacheとついているものを調べた(Starが少なすぎるものは除外)

感想

  • TTLとReplacement policyとGenericsをサポートしていて充分シンプルなLibraryがなかった
  • Cacheライブラリは差別化がいろいろあって、In-memoryなのでコードを読んで挙動を理解するのも頑張ればできうそうなので深堀りしたいってなるライブラリがいくつかあった。