15
11

More than 5 years have passed since last update.

Railsのキャッシュ(cache)について

Posted at

はじめに

今回はRailsのキャッシュについてまとめました!
上手く活用することで、WEBサイトの表示速度が格段に上がる便利な機能です。
ではでは早速説明していきます:smile:

キャッシュとは

表示する頻度の高いページ、あるいはページの一部などを保存しておき、
次回リクエストが入った時に保存してある場所から取り出すことです!
つまり新しく読み込むのではなく、以前読み込んだデータを再利用するようなイメージです!
キャッシュを使用することで、アプリケーションのパフォーマンスを効果的に上げることが出来ます!

キャッシュの種類

キャッシュには様々な種類があります。

①ページキャッシュ

名前の通り、該当ページのHTMLファイル全体をキャッシュします。
キャッシュされたファイルはpublic以下に配置されて、次回リクエストされた際はそこから静的ファイルとして返されます。

②アクションキャッシュ

こちらもページ全体をキャッシュすることには変わりないようです。
ただしページキャッシュと違って、状況に合わせた柔軟な対応をしてくれます。
同じページでもログイン前後で表示を変える場合があると思いますが、そういったページにも対応してくれます。
ページキャッシュの場合は静的ファイル化されてしまうので、1ファイルの内容が状況で変化する場合には使用できません。
その代わり処理速度は、ページキャッシュ > アクションキャシュ です!

③フラグメントキャッシュ

ページキャッシュ、アクションキャッシュがページを丸ごとキャッシュするのに対し、
こちらはページの一部分をキャッシュする機能です。
複数ページで共通して使用するようなHTMLが存在する場合に便利です!
キャッシュされたデータはキャッシュストアに保存され、2回目以降はキャッシュストアからデータを取り出します。

使用頻度は断トツでフラグメントキャッシュ

上記3種類のうち、フラグメントキャッシュの使用頻度が1番高いです!
実はRails3までは、上記3キャッシュ全てがRailsに備わっていました。
しかしフラグメントキャッシュの使用頻度が圧倒的に高いことから、Rails4以降で機能として最初から備わっているのはフラグメントキャッシュのみになりました。
ページキャッシュ、アクションキャッシュも使用できるのですが、その場合はgemを入れる必要があります。
その為今回は、Railsにもともと備わっている機能であるフラグメントキャッシュの使い方のみ説明します。
ページキャッシュ、アクションキャッシュを使用したい場合は、それぞれのgemページを確認してください。

●ページキャッシュ
gem:actionpack-page_caching
https://github.com/rails/actionpack-page_caching
●アクションキャッシュ
gem:actionpack-action_caching
https://github.com/rails/actionpack-action_caching

フラグメントキャッシュの使い方

①ローカル環境で使用できるように設定する

キャッシュはデフォルトではプロダクション環境でしか使用できないみたいです。
ローカル環境で使用したい場合はconfig/environment.rbファイルに以下の設定が必要になります。

environment.rb
 config.action_controller.perform_caching = true 

それでは早速HTMLファイルにキャッシュを設定しましょう。
設定はとても簡単!
キャッシュしたいHTMLをキャッシュブロック内に入れるだけです!
記述は以下のようになります。

test.html
<% cache 'key' do %>

  キャッシュしたいHTML

<% end %>

keyにはそれぞれのキャッシュのキーの名前を設定します。
要は、キャッシュストアに保存される際の名前です。
keyは自分で設定する必要がなければ省略することも可能です!
その場合はデフォルトのキーが設定されます。
デフォルトキーだとキャッシュメソッドが呼び出されたURLになります。

②skip_digestオプション・expiires_inオプション

●skip_digestオプション

デフォルトだと、キャッシュ対象のHTML文からダイジェストを作成してkeyを生成しています。
skip_digest: trueをつけることでダイジェストの生成をスキップできます。
と、この説明を他サイトで読んだ時に、"ダイジェストってなんだろ"と初心者の私はなったのですが、
どうやらデフォルトで作成するキーのことみたいです。
つまり、ダイジェストをスキップすることでkeyを自分自身で設定することが可能になるのだと思います。
違っていたらどなたかご指摘ください:bow:

●expires_inオプション

一言で言うと、キャッシュの有効期限です。
キャッシュストアに保存したデータは、期限を決めなければ1回目に読み込んだデータがずっと呼び出されてしまいます。
よほどのサイトでない限り、サイトの更新が1度も発生しないものはありえないでしょう。
そのため有効期限を設定してあげることで、期限がすぎたらまた改めてそのHTMLの最新データを読み込んでくれるようになります。
そして改めて読み込んだデータを新しくキャッシュストアに保存し、次の有効期限が来るまでの間はそのデータをキャッシュストアから呼び出す仕組みになっています。

上記2つのオプションの記述方法は以下の通りです。

test.html
<% cache 'key', expires_in: 1.minutes, skip_digest: true do %>

  キャッシュしたいHTML

<% end %>

今回は有効期限を1分で設定しています。

パーシャルのキャッシュ化

パーシャル自体をキャッシュしたい場合は、renderにオプションを付けるだけで良いらしいです!
とても簡単で便利ですね!

test.html
render(partial: 'books/book_list', cached: true) 

このようにcached: trueを付けるだけです!

さいごに

簡単ではありますが、基本的なフラグメントキャッシュの使用方法についてまとめました。

キャッシュはなかなか奥が深く、色々な設定が存在するのでまだまだ勉強が必要だなと感じました!
キャッシュの重要性や、使用する際の注意点などをまとめてあるサイトとして
https://postd.cc/the-complete-guide-to-rails-caching/
こちらがとてもおすすめです!
エンジニアとしての知見が様々な角度から深まる記事でした:muscle:

またRailsガイドもとても参考になりました。
詳しく書いてあるのでおすすめです。
https://railsguides.jp/caching_with_rails.html

それ以外で参考にしたサイトは以下です。
https://qiita.com/7kaji/items/12e583ae3270b4a7c533
https://qiita.com/jianghan0/items/44e558c49677062d120b

ぜひキャッシュを使いこなして処理速度の早いサイトを目指しましょう:thumbsup:

15
11
1

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
15
11