9.1 キャッシュ
ページキャッシュを利用する
Rails4以降で利用するにはactionpack-page_caching
もgemをインストールすることが必要です。
ページキャッシュは描画されたレスポンスを、静的ファイルとしてファイルシステムに保管します。 これによりウェブサーバーの段階で結果を返却することが可能なので非常に高速に動作します。
アクションキャッシュを利用する
Rails4以降で利用するにはactionpack-action_caching
もgemをインストールすることが必要です。
ページ全体をキャッシュをするという点ではページキャッシュと同じですが、ウェブサーバーで処理は完結せずにRailsまで届くため、before_action
なども利用することができ柔軟にキャッシュすることができます。
フラグメントキャッシュを利用する
フラグメントキャッシュはビューの一部をキャッシュすることができる機能で、ページ内のコンポーネントごとにキャッシュや期限切れを個別に設定したい場合は、フラグメントキャッシュを使います。
フラグメントキャッシュを李朝するには、ビューの中でロジックのフラグメントをキャッシュブロックでラップし、次回のリクエストでそれをキャッシュストアから取り出して表示します。
<% @posts.each do |post| %>
<% cache post do %>
<%= render post %>
<% end %>
<% end %>
コレクションキャッシュを利用する
render
メソッドで、コレクションを指定してパーシャルを表示するときもキャッシュを利用することができます。以下のようにrender
メソッドのcache
オプションをtrue
にすることでコレクションのキャッシュが有効になります。
<%= render partial: 'posts/post', collection: @posts, cached: true %>
SQLキャッシュを利用する
クエリキャッシュはSQLで返ってきた結果をキャッシュする機能です。リクエストごとに、一度発行されたクエリが見つかると、データベースへのクエリを実行する代わりに、以前の実行結果を利用します。
class PostsController < ApplicationController
def index
@posts = Post.all # 初回のクエリ
@posts = Post.all # 同じクエリの再実行
end
end
DBに対し、同じクエリが2回実行されると2回目以降はアクセスされません。1回目のクエリの結果がメモリ上のクエリキャッシュに保存されているので、2回目のクエリではメモリから結果を読み出します。
注意点としてクエリキャッシュはアクションの開始時に作成され、アクションの終了時に破棄されるのでクエリキャッシュはアクションの実行中しか有効ではありません。
キャッシュストアを指定する
Railsのキャッシュストアとして利用できるのは以下の種類があります。
メモリキャッシュ
:memory_store
で同じRubyプロセス内のメモリに保持されます。size
でキャッシュのサイズを指定することができます。
config.cache_store = :memory_store, { size: 64.megabytes }
ファイルキャッシュ
:file_store
でファイルシステムに保存します。の保存先のパスを指定する必要があります。
config.cache_store = :file_store, '/tmp/cache'
Memcachedへのキャッシュ
Memcachedにキャッシュを行うことができます。初期化時にMemcachedサーバのアドレスを指定する必要があります。
config.cache_store = :mem_cache_store, cache.256.tips