クライアント側キャッシュによる Rails のパフォーマンスの向上:マスター条件付き GET リクエスト
ロシアン ドール キャッシュ以外にも、Rails アプリのパフォーマンスを高速化するテクニックは他にもあります。今回は、Rails の組み込み条件付き GET サポートについて見ていきます。これにより、レンダリングされたページをユーザーのブラウザ キャッシュに保存できるようになります。
👋 キャッシュ以外のパフォーマンスについて詳しく読みたい場合は、Ruby (on Rails) のパフォーマンスについてさらに詳しく書いています。Ruby のパフォーマンス監視チェックリストを確認してください。
Etag ヘッダーと Last-Modified ヘッダー
ブラウザが Rails アプリ内のページに対して HTTP GET リクエストを実行すると、ルーターはそれをコントローラー アクションの 1 つにリンクします。次に、コントローラーはデータベースに必要なデータを要求し、ビューをレンダリングします。 HTTP 応答 (200 OK を含む) 応答コードとして) は、ブラウザが解析して表示できるように、応答本文のビューからレンダリングされた HTML とともにブラウザに送り返されます。
リソースが再度リクエストされると、同じパイプラインを通過します。状況によっては、その間ページが変更されなかったため、これは不要です。そのために、HTTP はその ETag を提供します。 および最終更新日 ヘッダー。これらを使用すると、ブラウザは応答本文を保存し、応答本文が古くなったときにヘッダーを使用して無効にすることができます。
E タグ 、またはエンティティ タグ 、クライアント側のキャッシュ検証に使用されるため、HTTP 応答のキャッシュ キーとして考えることができます。これらは、リクエストごとに HTTP レスポンス ヘッダーでブラウザに返されます。
~ $curl -I http://localhost:3000/products/1HTTP/1.1 200 OK...ETag:W/"9462d76cc55aeb6249fa990e39231c7c"Last-Modified:Wed, 25 Apr 2018 08:27:04 GMT...
後で応答が繰り返される場合、ブラウザはキャッシュ内で既存の応答を見つけ、最後のリクエストで保存された Etag を If-None-Match として使用します。 ヘッダー。このヘッダーは、このバージョンがすでにキャッシュに存在することを Rails アプリに伝えます。
リクエストの Etag が現在のものと一致する場合、Rails は 304 Not Modified を送信します。 レスポンスボディのないレスポンス。これにより、代わりにローカル キャッシュのキャッシュを使用するようブラウザに指示されます。
~ $curl -i -H 'If-None-Match:W/"9462d76cc55aeb6249fa990e39231c7c"" http://localhost:3000/products/1HTTP/1.1 304 Not Modified...ETag:W/「9462d76cc55aeb6249fa990e39231c7c」最終更新日:水, 25 4月 2018 08:27:04 GMT...
Rails での条件付き GET リクエスト
ローカルの Rails アプリケーションからページをリクエストすると、Rails がリクエストごとに Etag を自動的に追加することがわかります。同じページを連続して数回リクエストすると、リクエストごとに Etag が変更されたことがわかります。
Rails はデフォルトでリクエストごとに Etag を生成しますが、レスポンス本文全体のダイジェストを使用して Etag を生成します。これは <%= csrf_meta_tags %> を意味します。 csrf-token メタ タグがリクエストごとに変更されるため、レイアウトでは Etag が無効になります。これによりリクエストごとに本文が変更されるため、Etag は無効になり、ローカル キャッシュは古いものとしてマークされます。
それに加えて、Rails は 304 Not Modified を返すことはありません。 デフォルトでは、コントローラ内でローカル キャッシュが明示的に新しいものとしてマークされることはないためです。
fresh_when と stale?
条件付き GET のリクエスト ヘッダーから Etag を使用するには、ローカル キャッシュ内のオブジェクトを「新鮮」として明示的にマークする必要があります。たとえば、製品を表示するページの場合、製品とビュー テンプレートが変更されない限り、キャッシュを最新の状態に保つことができます。これを機能させるために、2 つのことを行います。
<オル>
Rails には、私たちのためにあらゆることをやってくれるヘルパーが付属しています。 fresh_when を使用すると、Etag と Last-Modified の日付を製品に明示的に基づいて指定できます。 .
明示的な respond_to がある場合 ブロックするには、stale? を使用してください fresh_when の代わりに .
今後は、製品ページの 1 つをリクエストすると、応答がローカルにキャッシュされます。同じページへの後続のリクエストには、キャッシュされたレスポンスがあることを Rails に伝えるための Etag が含まれ、それが新しい Etag と比較されます。それが一致する場合、Rails はページのレンダリングをスキップし、304 Not Modified を返します。

メモ :ページを更新すると、常にページのキャッシュされていないバージョンが要求されます。条件付き GET が機能するかどうかをテストするには、リンクを使用するか、代わりに「戻る」ボタンを使用して移動してください。
この記事と AppSignal Academy シリーズの以前の記事はいかがでしたか? Rails でのキャッシュに関する記事は他にもいくつかありますが、次に書いてほしい内容 (キャッシュ関連またはその他) を遠慮なくお知らせください。
ジェフ・クリーフトマイヤー
-
RubyでシンプルなWebSocketサーバーをゼロから構築する
最近、WebSocketはますます報道されています。彼らは「未来」だと聞いています。 Rails 5のActionCableのおかげで、これまで以上に使いやすくなっていると聞いています。しかし、WebSocketとは正確には何でしょうか。それらはどのように機能しますか? この投稿では、Rubyで単純なWebSocketサーバーを最初から構築することで、これらの質問に答えます。完了すると、ブラウザとサーバー間の双方向通信が実現します。 この投稿のコードは、学習演習として意図されています。実際の本番アプリにWebSocketを実装する場合は、優れたWebSocket-rubygemを確認して
-
Ruby2.6の9つの新機能
Rubyの新しいバージョンには、新しい機能とパフォーマンスの改善が含まれています。 変更についていきますか? 見てみましょう! 無限の範囲 Ruby 2.5以前のバージョンは、すでに1つの形式の無限範囲をサポートしています( Float ::INFINITY を使用) )、しかしRuby2.6はこれを次のレベルに引き上げます。 新しい無限の範囲 次のようになります: (1..) これは、(1..10)のような終了値がないため、通常の範囲とは異なります。 。 使用例 : [a, b, c].zip(1..) # [[a, 1], [b, 2], [c, 3]] [1,2,3,