比較表
主にメリット・デメリットを比較したり、利用シーンをまとめてみました。
FileStore | MemoryStore | MemCacheStore | RedisStore | |
---|---|---|---|---|
プロセス間共有 | ○ | ✗ | ○ | ○ |
スレッドセーフ | ○ | ○ | ○ | ○ |
ホスト間共有 | ✗ | ✗ | ○ | ○ |
無料 | ○ | ○ | ✗ | ✗ |
expires_in可否 | ✗ | ✗ | ○ | ○ |
速さ | やや速い | 速い | 遅い | 遅い |
削除アルゴリズム | 手動で削除する必要あり | LRU(LRU: Least Recently Used) | LRU | LFUやLRUを選択 |
利用シーン | 中規模サイトかつホスト数も少ない場合 | キャッシュデータが小さい時(20MB以下) | ホストが多い場合 大規模なアプリケーション |
ホストが多い場合 大規模なアプリケーション |
注意点 | ディスクを圧迫 | メモリを圧迫 | キャッシュデータ制限 | |
仕組み | 特定のファイルに保存していく | スレッド毎にRAMに保存していく | Memcache serverに保存していく | Redis serverに保存していく |
速度面
遅い <——————————————————————————————————————————> 速い
RedisStore, MemCacheStore < FileStore < MemoryStore
価格面
安い <-————————————————————————————————————————> 高い
FileStore, MemoryStore < MemCacheStore, RedisStore
所感
FileStoreとMemoryStore
キャッシュデータ量が小さく、ホストも多くない小規模アプリなら、速くて安いMemoryStoreやFileStoreが良さそうだと思いました。
しかし、これら2つはスレッドやプロセス毎にキャッシュを管理する必要があるため、キャッシュの更新を上手く管理しないとバグのオンパレードになると考えられます。
そのため利用するときは以下の2つかなと思います。
- 滅多に更新しないデータのみをキャッシュする場合に使用する
- 開発環境だけ使用する
MemCacheStoreとRedisStore
MemCacheStoreやRedisStoreは大規模なデータ量を保持可能なのと、プロセスやホスト毎にデータを保存する訳ではないのでバグも起きにくいと考えられます。
そのため、本番環境でよく使われるのかなと思いました。
また、MemCacheStoreやRedisStoreはexpires_inオプションを使って有効期限を指定できます。
ネットワークを介すので実装する際は、そもそもキャッシュデータを取りに行くより実行したほうが速いということがないかは都度検討する必要がありそうです。
RedisStoreの利点
RedisStoreはLRUやLFUを選択できるのと、ディスクに保持できる点が優れているみたいです。
LRUとLFUは以下のアルゴリズムのことです。
- LRU(Least Recently Used): 直近の利用が最も少ないキャッシュを削除するアルゴリズム
- LFU(Least Frequently Used): 利用頻度が最も低いキャッシュを削除するアルゴリズム
redis4.0からLFUがサポートされています。
参考
Rails guide: Railsのキャッシュ機構
Railsアプリを66%スピードアップ ― Railsキャッシュの完全ガイド
redis document