Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Railsの組み込みキャッシュストア:概要

新しいRailsアプリを生成するとき、キャッシュはすでに設定されています。これにより、cacheを使用して一部のビューフラグメントをラップするのと同じくらい迅速に開始できます。 ヘルパーまたはRails.cache.fetchの使用 外部APIの結果を保存します。キャッシュされたデータは、Railsのキャッシュストアの1つに保存されます。これにより、データをメモリ、Memcached、Redisに保持したり、ディスクに直接書き込んだりすることができます。

しかし、どの状況に最適なキャッシュストアはどれですか?この概要では、各オプションを見ていきます。

👋そして、この記事が気に入ったら、Ruby(on Rails)のパフォーマンスについて書いたものがもっとたくさんあります。Rubyのパフォーマンス監視チェックリストをチェックしてください。

ファイルストア

:file_store キャッシュストアが特別に構成されていない場合、デフォルトで使用されます。名前が示すように、ファイルシステムにキャッシュエントリを書き込みます。これらは最終的にtmp/cacheに入れられます cache_storeを明示的に設定して別の場所を選択しない限り、アプリケーションのルートのディレクトリ :file_storeへの構成 使用したいディレクトリへのパスを渡します。

config.cache_store = :file_store , "/path/to/cache/directory"

キャッシュファイルはディスクに保存され、自動的に削除されません。つまり、ディスクがいっぱいにならないように、自分で削除するように注意する必要があります。たとえば、Rails.cache.cleanupを実行します 定期的にキャッシュに期限切れのエントリがないようにします。

ファイルストアは、各エントリがキャッシュディレクトリに保存され、ファイルを削除することでキャッシュからアイテムを削除できるため、開発に役立ちます。これは、たとえば、キャッシュの無効化をテストする場合に役立ちます。

本番環境では、各サーバープロセスが同じファイルシステムで実行されている場合にファイルストアが役立ちます。メモリベースのキャッシュストアよりも低速ですが、キャッシュが非常に大きくなる可能性がある場合は、ファイルストアが優れている可能性があります。

メモリストア

バージョン5.0以降、Railsは自動的に:memory_storeを設定します 新しいアプリケーションを生成するときの開発構成で。メモリストアを使用する場合、キャッシュされたデータはRubyWebサーバーのプロセスでメモリに保持されます。

データはWebサーバーと同じプロセスでメモリに保持されるため、メモリストアは、開発Webサーバーを再起動するたびに自動的にクリアされるため、開発で使用するのに最適です。

デフォルトでは、メモリ内ストアは32メガバイトを使用しますが、:sizeを渡すことでこれをオーバーライドできます。 キャッシュストアを構成するときのオプション。

config.cache_store = :memory_store, { size: 16.megabytes }

キャッシュがいっぱいになると、使用頻度の最も低いエントリが自動的にキャッシュから削除され、新しいエントリ用のスペースが確保されます。

本番環境でメモリストアを使用することは可能ですが(そして、見つけることができる最速のソリューション)、複数のサーバープロセスを実行しているシステムにはお勧めしません。プロセスは互いのキャッシュにアクセスできないため、各プロセスはキャッシュの独自のコピーを維持する必要があります。

Memcacheストア

:mem_cache_store Dalli gemとMemcachedを使用して、エントリを一元化されたメモリ内キャッシュに保存します。

データは、Rubyサーバープロセスではなく、別のプロセスに保持されます。そのため、アプリの再起動時にキャッシュは削除されませんが、Memcachedサーバーが実行を継続している限りキャッシュはメモリに残ります。再起動すると、新しいキャッシュから開始します。

Memcacheストアは、デフォルトでキャッシュサーバーがローカルホストで実行されていると想定しますが、1つまたは複数のアドレスを渡してリモートサーバーを使用できます。

config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com"

Memcachedは、デフォルトで最大64 MBのキャッシュサイズを使用するように構成されていますが、コマンドラインオプションまたはmemcached.confを使用して構成できます。 ファイル。メモリストアと同様に、キャッシュが最大サイズに達すると、最も使用頻度の低いアイテムの削除が開始されます。

:mem_cache_store 実稼働環境で使用できるキャッシュストアです。中央のmemcachedサーバーを使用することで、リモートのmemcachedサーバーを使用する場合でも、複数のWebサーバー間で、さらには複数のホスト間でキャッシュを共有できます。

Redisキャッシュストア

Rails 5.2では:redis_cache_storeが導入されました ストア。Memcacheストアを使用する場合と同じように、キャッシュエントリをRedisに保存できます。

RedisをRailsキャッシュストアとして使用するには、 LRUとして設定された専用のRedisキャッシュを使用します (最後に使用した)既存のRedisサーバーにストアを指定する代わりにキャッシュして、エントリが最大サイズに達したときにストアから確実に削除されるようにします。

Redisストアは、Redis gem(Redis ::Distributedを含む)およびhiredisと連携し、1つまたは複数のリモートサーバーの設定など、さまざまな構成オプションのサポートを提供します。

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ほど普及していませんが、Redisストアは将来的に人気のあるRailsキャッシュストアになる可能性があります。

どのキャッシュストアを使用しますか?

一般に、Railsのファイルストアとメモリストアは開発には最適ですが、警告を理解して理解している場合は、小規模なアプリケーションの本番環境で使用できます。実稼働グレードのMemcachedストアとRedisストアは、特に複数のホストで複数のWebサーバーを実行している場合は特に、大規模な実稼働アプリに適しています。

これで、Railsのキャッシュストアの概要は終わりです。各ストアの詳細と構成オプションについては、Railsガイドの「キャッシュストア」セクションを確認してください。

この記事とAppSignalAcademyシリーズの以前の記事はどうでしたか? Railsでのキャッシングに関する記事がさらにいくつか並んでいますが、次に何について書きたいか(キャッシング関連またはその他)を遠慮なくお知らせください!


  1. Rails5でのAngularの使用

    あなたは前にその話を聞いたことがあります。分散型で完全に機能するバックエンドAPIと、通常のツールセットで作成されたフロントエンドで実行されているアプリケーションがすでにあります。 次に、Angularに移動します。または、AngularをRailsプロジェクトと統合する方法を探しているだけかもしれません。これは、この方法を好むためです。私たちはあなたを責めません。 このようなアプローチを使用すると、両方の世界を活用して、たとえばRailsとAngularのどちらの機能を使用してフォーマットするかを決定できます。 構築するもの 心配する必要はありません。このチュートリアルは、この目的のた

  2. Windowsストアキャッシュが破損している可能性があるエラーを修正

    Windows ストアからアプリをダウンロードできない場合は、Windows ストアのキャッシュが破損している可能性があり、それが原因でストアが正常に機能していません。これがここに当てはまることを確認するには、Windows ストア アプリのトラブルシューティング ツールを実行する必要があります。 「Windows ストアのキャッシュが破損している可能性があります」というエラー メッセージが表示され、トラブルシューティング ツールで問題を解決できなかったことがわかります。 エラー メッセージには、問題の原因が Windows キャッシュにあることが明確に示されています。この問題を解決する