Railsの組み込みキャッシュストア徹底解説:File・Memory・Memcached・Redisの違いと使い分け
新しいRailsアプリケーションを生成すると、キャッシュ機能はすでにセットアップされています。そのため、ビューの断片をcacheヘルパーで囲んだり、Rails.cache.fetchを使って外部APIの結果を保存したりするだけで、すぐにキャッシュを活用し始められます。キャッシュされたデータは、Railsのいずれかのキャッシュストアに保存され、メモリ内、Memcached、Redis、さらにはディスクへの直接書き込みなど、さまざまな保存先を選択できます。
しかし、複数あるキャッシュストアの中で、どれがどのような状況に最適なのでしょうか?この記事では、それぞれの選択肢について詳しく見ていきます。
👋 この記事が気に入った方は、Ruby(on Rails)のパフォーマンスに関する他の記事もぜひご覧ください。「Rubyパフォーマンス監視チェックリスト」もあわせてチェックしてみてください。
ファイルストア(:file_store)
:file_storeは、キャッシュストアが明示的に設定されていない場合にデフォルトで使用されるストアです。名前の通り、キャッシュエントリをファイルシステムに書き込みます。デフォルトではアプリケーションルート直下のtmp/cacheディレクトリに保存されますが、cache_store設定で:file_storeを明示的に指定し、任意のディレクトリパスを渡すことで、別の場所を選ぶことも可能です。
config.cache_store = :file_store , "/path/to/cache/directory"キャッシュファイルはディスクに保存され、自動的には削除されません。そのため、ディスクが一杯にならないよう、自分で管理する必要があります。例えば、定期的にRails.cache.cleanupを実行すれば、期限切れのエントリをキャッシュから取り除けます。
ファイルストアは開発環境で特に便利です。各エントリがキャッシュディレクトリに個別のファイルとして保存されるため、該当ファイルを削除するだけで特定のアイテムをキャッシュから除外できます。これは、キャッシュ無効化のテストなどに役立ちます。
本番環境では、すべてのサーバープロセスが同一のファイルシステム上で動作している場合に有効です。メモリベースのキャッシュストアより速度は劣りますが、キャッシュが非常に大きくなる可能性があるケースでは優れた選択肢になります。
メモリストア(:memory_store)
Rails 5.0以降では、新規アプリケーションの生成時に、開発環境の設定に対して自動的に:memory_storeがセットアップされます。メモリストアを使用すると、キャッシュデータはRubyウェブサーバーのプロセス内のメモリに保持されます。
データがWebサーバーと同じプロセスのメモリ上にあるため、開発サーバーを再起動するたびにキャッシュが自動的にクリアされる点が魅力で、開発環境に最適です。
デフォルトでは32MBまで使用しますが、キャッシュストアの設定時に:sizeオプションを渡すことで変更できます。
config.cache_store = :memory_store, { size: 16.megabytes }キャッシュが上限に達すると、最も使われていない(LRU:Least Recently Used)エントリが自動的に削除され、新しいエントリのための空きが確保されます。
本番環境でメモリストアを使うことも可能です(速度面では最速のソリューションです)。ただし、複数のサーバープロセスを稼働させるシステムには推奨されません。プロセス同士は互いのキャッシュにアクセスできないため、各プロセスが独自のキャッシュコピーを保持することになり、非効率だからです。
Memcacheストア(:mem_cache_store)
:mem_cache_storeは、Dalli gemとMemcachedを利用して、エントリを一元化されたインメモリキャッシュに保存します。
データはRubyサーバーのプロセスとは別のプロセスに保持されます。そのため、アプリを再起動してもキャッシュは失われず、Memcachedサーバーが動作し続ける限りメモリ上に残ります。Memcachedサーバー自体を再起動した場合は、キャッシュは新しくやり直しになります。
Memcacheストアはデフォルトでlocalhost上のキャッシュサーバーを想定していますが、1つまたは複数のアドレスを渡すことで、リモートサーバーを利用することもできます。
config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com"Memcachedはデフォルトで最大キャッシュサイズ64MBに設定されていますが、コマンドラインオプションやmemcached.confファイルで変更可能です。メモリストアと同様に、キャッシュが最大サイズに達すると、使用頻度の低いアイテムから順に削除されていきます。
:mem_cache_storeは、本番環境向けの定番キャッシュストアです。中央のMemcachedサーバーを使うことで、複数のWebサーバー間でキャッシュを共有でき、リモートのMemcachedサーバーを利用すれば複数ホスト間での共有も実現できます。
Redisキャッシュストア(:redis_cache_store)
Rails 5.2で導入された:redis_cache_storeは、Memcacheストアと同じように、キャッシュエントリをRedisに保存できるストアです。
既存のRedisサーバーをそのまま指定するのではなく、RedisをRailsのキャッシュストアとして使う場合は、LRU(Least Recently Used)キャッシュとして構成された専用のRedisキャッシュを用意してください。そうすることで、最大サイズに達した際にエントリが確実にストアから削除されます。
Redisストアはredis gem(Redis::Distributedを含む)やhiredisと連携し、単一または複数のリモートサーバーの指定など、多くの設定オプションをサポートしています。
cache_servers = %w[redis://cache-01:6379/0 redis://cache-02:6379/0]
config.cache_store = :redis_cache_store, { url: cache_servers }Redisは定期的にデータセットをディスクへ書き出すため、キャッシュサーバーを再起動しても、キャッシュデータの大部分は保持されます。開発環境では、コンソールからRails.cache.deleteを使ってキャッシュ済みアイテムを削除できます。
本番環境において、RedisはMemcachedと肩を並べる一元化キャッシュストアです。Railsアプリでの採用実績はまだMemcachedほど広くありませんが、今後人気のキャッシュストアになっていく可能性は十分にあります。
どのキャッシュストアを使うべきか?
一般的に、Railsのファイルストアとメモリストアは開発環境に最適であり、それぞれの特性や注意点を理解した上であれば、小規模なアプリケーションの本番環境でも活用できます。一方、大規模な本番アプリケーション、特に複数ホスト上で複数のWebサーバーを稼働させるケースでは、本番レベルのMemcachedストアやRedisストアの方が、通常はより良い選択となります。
以上が、Railsのキャッシュストアに関する概要でした。各ストアの詳細な仕様や設定オプションについては、Railsガイドの「Cache stores」セクションをぜひ参照してください。
この記事やAppSignal Academyシリーズのこれまでの記事はいかがでしたか?Railsにおけるキャッシング関連の記事をさらにいくつか準備中ですが、「次に読みたいテーマ」(キャッシュ関連でもそれ以外でも)のご希望があれば、ぜひお知らせください!
-
Rails5でのAngularの使用
あなたは前にその話を聞いたことがあります。分散型で完全に機能するバックエンドAPIと、通常のツールセットで作成されたフロントエンドで実行されているアプリケーションがすでにあります。 次に、Angularに移動します。または、AngularをRailsプロジェクトと統合する方法を探しているだけかもしれません。これは、この方法を好むためです。私たちはあなたを責めません。 このようなアプローチを使用すると、両方の世界を活用して、たとえばRailsとAngularのどちらの機能を使用してフォーマットするかを決定できます。 構築するもの 心配する必要はありません。このチュートリアルは、この目的のた
-
「Windowsストアのキャッシュが破損している可能性があります」エラーを修正する6つの方法
Microsoft Store(Windowsストア)からアプリをダウンロードできない場合、その原因としてWindowsストアのキャッシュが破損していることが考えられます。キャッシュに問題が発生すると、ストアが正常に動作しなくなります。 この問題が実際に発生しているかどうかを確認するには、「Windows ストア アプリ」トラブルシューティングツールを実行します。「Windowsストアのキャッシュが破損している可能性があります」というエラーメッセージが表示され、トラブルシューティングツールでも問題を自動修復できなかった場合は、キャッシュの破損が原因である可能性が高いといえます。 この問題を解