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

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

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

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

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

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

###使用頻度は断トツでフラグメントキャッシュ
上記３種類のうち、フラグメントキャッシュの使用頻度が１番高いです！
実はRails3までは、上記３キャッシュ全てが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度も発生しないものはありえないでしょう。
そのため有効期限を設定してあげることで、期限がすぎたらまた改めてそのHTMLの最新データを読み込んでくれるようになります。
そして改めて読み込んだデータを新しくキャッシュストアに保存し、次の有効期限が来るまでの間はそのデータをキャッシュストアから呼び出す仕組みになっています。

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

```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: