1. Qiita
  2. Items
  3. Rails

Rails のキャッシュについて

  • 108
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Rails3 まで

  • ページキャシュ(ページ全体をキャッシュ)

    ページのレンダリング結果を静的な HTMLファイルとしてファイルシステムに保存する機能。HTMLファイルは publicディレクトリ以下に配置され、Webサーバ(Nginxなど)から直接返すことができる。リクエストパラメータ(条件付き GET リクエスト)が付与される場合は避けた方が良い。

  • アクションキャッシュ(アクション単位でキャッシュ)

    ページキャッシュと同じく、ページ全体をキャッシュする機能。柔軟な制御をしたい場合はアクションキャッシュを用いる。(非ログインユーザのみに対してページキャッシュしたいなど)アクションキャシュは、Webサーバで直接返さず、2回目以降のアクセスでも Rails で処理する。その分負荷がかかるが、柔軟な制御ができる。また、アクションキャシュの保存は設定した Railsのキャッシュストア(ActionController::Base.cache_store)が用いられる。

  • フラグメントキャッシュ(ページの一部をキャシュ)

    HTMLを部分的にキャッシュする機能。多くのページで共通するHTMLがある場合などに有効的。1度目のレンダリング時にHTML文字列としてキャッシュストアに保存され、2度目以降のレンダリングでは、キャッシュストアに保存されたそのHTMLが使われる。

上記の3つが代表的なキャッシュ機能としてあった。

Rails4

  • フラグメントキャッシュ(ページの一部をキャシュ)

ページキャッシュと、アクションキャシュは廃止され、フラグメントキャシュのみ使える。
Russian Doll Caching、cache_digests、fragmen cache などと呼ばれるものは、Rails3 までのフラグメントキャシュと指し示すものとすべて同じ。

Rails4 で内部的に使われているgemが、従来のRailsにおける fragment cache を進化させた cache_digests であり、cache_digestsの仕組みに対する愛称が Russian Doll Caching である。

Rails3 までの違いは、複数のフラグメントキャッシュを入れ子にしている場合に、内側のコンテンツの更新に連動して、外側のフラグメントキャッシュのキーが自動的に変更される。(マトリョーシカってそういうことか。)

キャッシュを使う(Russian Doll Caching)

ビューの中に、下記のように記述する

<% cache do -%>
  キャッシュしたい内容
<% end -%

内側のモデル(belongs_to で touch: trueオプションを加える)を修正する。
これで、内側のモデルが更新された時に、外側も更新(updated_at)されるようになりキャッシュも更新される。

キャッシュキー

キャッシュのキーは、デフォルトでキャッシュメソッドが呼び出されたURLから生成される。

views/<domain>/<controller>/<action>/<MD5>

明示的に指定することもできるけど、デフォルトでモデルのインスタンスをキャッシュのキーに指定されて、キーの中にupdated_atを含むので、モデルが更新されたらキャッシュも更新されて便利っぽい。

キャッシュストア

キャッシュストアには、標準(ActiveSupport)でファイルシステム、メモリ、Memcached がある。用途に合わせて使い分ける必要があるが、 スケールアウト(キャッシュの一元化、ヒット率)を考えると多くの場合 Memcached をキャッシュストアとして使うと良さそう。

アクションキャッシュ、ページキャッシュを使いたいという場合

分離された gem を用いることで使うことができる。
(DHH の思想で Rails のコアからは廃止されたので、非推奨?)

ページキャッシュなどは、 NginxVarnish などが担う役割とのことなので、次回は Varnish もしくは Nginx を用いてページキャッシュを実現してみようと思うます。

引用・参考

以下の書籍、記事から多く引用・参考にさせていただきました。
スライドや図、サンプルコードなどもあってとてもわかりやすいです。

Comments Loading...