LoginSignup
12
8

More than 3 years have passed since last update.

【Rails】キャッシュについてわかりやすくまとめてみた

Last updated at Posted at 2020-07-19

0. キャッシュとは?

リクエスト時にデータを保存しておき、次回の同じリクエストの発生時に、保存しておいたデータを再利用すること。

これにより改めてデータを生成する必要がなくなるので、パフォーマンスの高速化につながる。
キャッシュを利用した箇所はDBにアクセスしてクエリを発行しなくてよくなる。

1. キャッシュの保存場所

Railsのキャッシュ機能では、キャッシュの保存場所(キャッシュストア)として複数の選択肢がある。

  1. ファイルストア
  2. メモリストア
  3. Memcache
  4. Redis

他にもいくつかあるようだが、代表的なのは上の4つで、Redisを使うのが一般的らしい。
ちなみに自分の仕事では、Memchacheをキャッシュストアとして利用するdalli というgemをキャッシュストアの設定に使用していた。

Railsアプリケーション上では以下のように設定する。

config/environments/production.rb
config.cache_store = :dalli_store  # :memory_store, :redis_cache_store など設定可能。

1. Railsのキャッシュの種類

何をキャッシュするのか?に基づいて以下の3種類がある。

  1. ページキャッシュ
  2. アクションキャッシュ
  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. 参考リンク

分かりやすく解説してくれている記事がたくさんあります。

12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8