日々徒然

プログラミングしたりお酒飲んだりする毎日

Railsのキャッシュについて雑なまとめ

railsのキャッシュの仕組み

ページキャッシュ

Webサーバー側でページを生成してくれる Rails4からgemに分離された https://guides.rubyonrails.org/caching_with_rails.html#page-caching

アクションキャッシュ

コントローラーのアクション毎に設定できるキャッシュ 認証後にページをキャッシュみたいな使い方ができる ただRails4以降は推奨されていない(フラグメントキャッシュが推奨)

フラグメントキャッシュ

Rails4以降はこちらがメインのキャッシュ ページの部分ごとにキャッシュを設定できる またActiveRecordインスタンスもまとめてキャッシュできる 基本的にView側で使う機能っぽい、 APIモードのjbの中で同様のことができるのかどうかは調査しないと分からなさそう

低レベルキャッシュ

View側をキャッシュするのではなくて、特定の値、クエリの結果をキャッシュする場合に使う(Railsは入れようと思えばなんでもキャッシュできる) 例えばクエリ実行後のActiverecordインスタンスをキャッシュするとか

条件付きGETについて

HTTPの仕様で同様のリクエストを送った場合にEtagを参照して304を返すかどうか判断している 流れ↓ 1. 初回リクエスト 1. レスポンス(headerにEtagが付与される) 1. 次回以降同一リクエストの場合request headerにIf-None-Matchが付与され、レスポンスのEtagと一致している場合に304が返りブラウザ内キャッシュが返却される(304の場合ヘッダのみ返却)

APIモードの場合はおそらくJSONの内容でEtagを生成している

例↓ 1. 初回リクエスト 1. レスポンス - response headerにEtagが付与される 1. プログラム名を更新 1. 1と同じ内容でリクエスト - If-None-Matchに2のEtagが付与される 1. If-None-MatchのEtagと今回のEtagに乖離があるため200が返却される - 更新により返却されるJSONが変わったためEtagの中身も変わるため