ここでは、フラグメントキャッシュ(viewにおけるキャッシュ)についてまとめています。
注意: 時間の経過とともにレスポンスが変化するデータのキャッシュについて
はじめに覚えておくこと
-
Rails.cache.fetch
このメソッドで、キャッシュのread/writeが両方出来る。 -
<cache_key>
後述の通り、基本的にRailsが用意しているものを使う。 -
expires_in
キャッシュの有効期限を指定する。
実装例
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
生成されるキャッシュのキー
views/products/1-201505056193031061005000/bea67108094918eeba42cd4a6e786901
以下の要素から構成されています。
- views/<テーブル名>
- id
- レコードのupdated_at
- テンプレートツリーダイジェスト(キャッシュされるビューフラグメントの内容から算出されたハッシュダイジェスト。ビューのHTMLが変更された場合にもキャッシュは更新されるので、そのために利用)
特定の条件でキャッシュしたい場合
cache_if
、cache_unless
を使用可能。
<% cache_if admin?, product do %>
<%= render product %>
<% end %>
コレクションキャッシュ
<%= render partial: 'products/product', collection: @products, cached: true %>
ログ
Cache read: views/e2a9dc497/top_page/show:e7f6dd0afce2b83daec666e202917715/ja/users/30-20191010012413000000/toppage/show
その他(Railsのデフォルトではないキャッシュについて)
以下は、Rails4で本体から取り除かれて、gem化されたものです。
ページキャッシュ
- Rails 4本体から取り除かれ、gem化された。actionpack-page_cachingを参照。
- 認証が不要なページのキャッシュに使われる。
- nginxなどのwebサーバーによって生成されるページへのリクエストを(Railsスタック全体を経由せずに)キャッシュするメカニズム。
→ ページキャッシュではなく、CDNやリバースプロキシを使うのが一般的。
アクションキャッシュ
- Rails 4本体から取り除かれ、gem化された。actionpack-action_cachingを参照。
- リクエストがRailsスタックにヒットしたときに、before_filterを実行してからキャッシュを返す。認証が必要なページでも有効。