Golangでインメモリなキャッシュを実装する

概要

Golangのインメモリキャッシュのライブラリは良さそうなものが存在するが、軽量でシンプルなもので十分だったので自前で実装してみた。

実装

要件

  • 複数のデータを保持することができる。
  • 期限付きのデータをメモリに保持することができる。期限が来たらメモリから破棄されること。
  • キャッシュへの同時参照、更新を考慮し、データのロックが意識されていること。

初期設計

github.com - bmf-san/go-snippets/architecture_design/cache/cache.goに置いてあるが、転載。

最初に思いついた感じで実装したもの。

ロックの処理を気にしなくてよいsync.Mapが便利で良いなぁと思っていたのだが、データ構造や機能的に要件を満たせていないので却下。

リリース版

github.com - bmf-san/go-snippets/architecture_design/cache/cache.goに置いてあるが、転載。

要件を満たす実装をしたバージョン。

sync.Mapが便利なので使いたかったのだが、sync.Mapにキャッシュデータを保持させるとキャッシュキー指定なしにキャッシュデータの期限切れチェック・削除が難しいため、キャッシュデータの保持にはmapを採用することにした。

期限切れチェックはtickerを使ってインターバルを置いてチェックするようにしている。 上記では1秒毎のインターバルとなっている。 上記の実装ではキャッシュ期限+1秒経過するまではキャッシュにアクセスすることができてしまうので、実際のキャッシュ期限はexpiresで指定した時間+インターバルになっている。

所感

Golangでの並行処理やロックに入門する良い機会だった。

参考