Hard work by INTERNET

ベンチャーで働くひとりぼっちWEB開発者が頑張るブログ

開発用に使うRailsのキャッシュストラテジーはどれを使ったほうがよいか

activesupportのcache.rbをサラッと読んでわかったことをまとめます。

本文

本番環境だとRedisとかmemcachedにキャッシュを載せていると思いますが、開発環境だと正直何でもいいわけです。 本番で使っているストアと揃えたほうが、地雷を踏まなくても済む可能性があるので、本番と開発で使うキャッシュストアは揃えたほうがいいでしょう。

ところで、ミドルウェアのインストールが不要で今すぐ使える開発用キャッシュストラテジーは3つあります。

  • FileStore
  • LocalCache
  • NullStore

FileStore

ファイルに書き出します。tmp/cache配下に書き込まれるのを確認できると思います。たまにクリアしてあげないともしかしたらディスクを食い尽くすかも。 お手軽ですし、ミドルウェアなしでRedisとかmemcachedのように振る舞うのでよく使われがちです。 ファイルに書き出した中身はMarsharでシリアライズしたバイナリが格納されており、期限も一緒に入っています。 Railsのキャッシュには期限切れのエントリを削除するインターフェイスが提供されており、FileStoreで期限切れエントリ処理を実行すると、すべてのエントリーでデシリアライズをかけて日付を確認するため、IOをめちゃくちゃ食います。

ちなみに、Redisをキャッシュストアに使う場合には、期限切れエントリを削除するメソッドはありません。Redisが定期的にGCするようなのでする必要がないからですね。

LocalCache

これはインメモリキャッシュです。こいつはRackMiddlewareを使って実装されており、キャッシュは1リクエスト内のみ有効です。次のリクエストが来る時には消滅しています。 メモリ上のキャッシュなのでオーバーヘッドが少なく高速に動作するのが特徴です。開発環境だとデータ量が少なくてあまりボトルネックにならないとは思いますが。 また、リクエスト毎にクリアするので、キャッシュによるバグを踏むことはないでしょうが、本番でのみ発生する不具合が起きる可能性があります。

NullStore

キャッシュのインターフェイスを持ちますが、どこにも書き込みをしません。

まとめ

3つとも書き込み場所と挙動がすべて違います。開発環境でキャッシュ系の不具合が起きたら特定できるように把握しておきましょう。

記事タイトルへの回答ですが、デザイナーとかにわたす環境だったらNullStoreにしておいて、自分が使う環境だったらFileStoreを使います。

おわり