Rails で目的別に CacheStore を使い分けたい場合どうするか。
想定する状況
例えば、普段は MemCacheStore を CacheStore として使っているけど、一部のキャッシュはもっと高速にしたいので MemoryStore を使いたい場合。
具体的に起こった事例でいうと、MemCacheStore にキャッシュしていたが、計測してみると memcached とのネットワーク転送に若干時間がかかっていた。ネットワークコストをなくすため、そこだけ MemoryStore したい。幸い MemoryStore のデメリットも、そこだけに限れば問題にならなそう。というケース。
使いたい CacheStore を個別に作ればよい
上のケースだと、ActiveSupport::Cache::MemoryStore
を使いたいので、config/initializers/
下に適当な ruby ファイルを作って MemoryStore
を生成してやる。
::HOGE_MEMORY_STORE = ActiveSupport::Cache.lookup_store(:memory_store)
Rails の中で ActiveSupport::Cache.lookup_store 経由で CacheStore を作っていたので真似しているが、直接 ActiveSupport::Cache::MemoryStore.new
でもよい。
使う側では普段使っている Rails.cache
の代わりに上記で生成した CacheStore を使ってやればよい。
::HOGE_MEMORY_STORE.write('hoge', 'nya-')
まとめ
- 使いたい CacheStore を自分で生成して、使い分ければよい
- というのをこれから実践する(実践したので後述)
- 記事とは関係ないですが、キャッシュの利用は計画的に
追記
上の具体例に対して実践したところ、そこまで大きな効果はなかった。
というのも実際の production 環境ではネットワーク速度も早いため。
もう少ししっかり計測してから取り組む価値があるか判断した方がよかったです。
とは言えメモリストアは最速なので、速いは速いですよ。
ということで、キャッシュの利用は計画的に。。。自戒の意味を込めて書いたのに早速ブーメランとは。。。