0. キャッシュとは?
リクエスト時にデータを保存しておき、次回の同じリクエストの発生時に、保存しておいたデータを再利用すること。
これにより改めてデータを生成する必要がなくなるので、パフォーマンスの高速化につながる。
キャッシュを利用した箇所はDBにアクセスしてクエリを発行しなくてよくなる。
1. キャッシュの保存場所
Railsのキャッシュ機能では、キャッシュの保存場所(キャッシュストア)として複数の選択肢がある。
- ファイルストア
- メモリストア
- Memcache
- Redis
他にもいくつかあるようだが、代表的なのは上の4つで、Redisを使うのが一般的らしい。
ちなみに自分の仕事では、Memchacheをキャッシュストアとして利用するdalli というgemをキャッシュストアの設定に使用していた。
Railsアプリケーション上では以下のように設定する。
config.cache_store = :dalli_store # :memory_store, :redis_cache_store など設定可能。
1. Railsのキャッシュの種類
何をキャッシュするのか?に基づいて以下の3種類がある。
- ページキャッシュ
- アクションキャッシュ
- フラグメントキャッシュ
よく使われるのはフラグメントキャッシュで、ビューのロジックの一部分をキャッシュする。
これはgemを追加せずにデフォルトで使用できる。
2. フラグメントキャッシュとは?
以下のような理解。
1. `cache` メソッドを使用。
2. 指定した引数から生成されるキーを元に、
3. ブロックに渡したビューのロジックをキャッシュする。
サンプルコード
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
Railsガイドの例。
ここでは product
というオブジェクトをキーとし、 product
というパーシャルをキャッシュしている(ややこしい)。
3. 注意点
当たり前ではあるが、同一リクエスト内で同じキーを2回利用すると、意図しない挙動になってしまうので、ビュー内で一意である必要がある。
例えばこんな感じ。
app/views/products/index.html.erb
<%#= bad %>
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
...
<% product = @products.first %>
<% cache product do %>
<%= render item %>
<% end %>
<%#= good %>
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
...
<% item = @items.first %>
<% cache item do %>
<%= render item %>
<% end %>
例が分かりづらいかも。。
4. 参考リンク
分かりやすく解説してくれている記事がたくさんあります。