キャッシュ
- キャッシュとは、使用頻度の高いデータを高速な記憶装置に蓄えておくことにより、いちいち低速な装置から読み出す無駄を省いて高速化すること。また、その際に使われる高速な記憶装置や、複製されたデータそのもののこと。
Railsにおけるキャッシュ
Rails3
- ページキャッシュ(ページ全体をキャッシュ)
- アクションキャッシュ(アクション単位でキャッシュ)
- フラグメントキャッシュ(ページの一部をキャッシュ)
Rails4
Rails4ではページキャッシュとアクションキャシュは廃止され、フラグメントキャシュのみ使える。
フラグメントキャッシュとは
rails で利用できる view の一部分をキャッシュする機能。rails 3以上ならデフォルトで利用できる。railsは view のレンダリングが遅いので、アクセスの多いサイトはキャッシュの利用が必要になってくる。
書き方(Slim)
1 2 |
|
キーにStringを指定した場合
下記のような場合に、
1 2 |
|
この@some_db_data
の中身が変更されても、キャッシュには変更が反映されない。キャッシュのキーに含まれるdigestはあくまでHTMLを元に作られるため、データの変更があってもdigestは変更されないからである。
また、自動で付与されるdigestを利用しないようにするには
1 2 |
|
とする。この場合、HTMLに変更があったとしても、キャッシュには反映されず変更前のものが表示される。
キーを省略した場合
1 2 |
|
上記のように、キーを省略した場合は、ページのurlからキーが自動で作られる。url依存のキーなので、同じページでこの形を複数記述すると、どちらかのキャッシュが上書きされてめちゃくちゃになる。
キーにオブジェクトを指定した場合
1 2 |
|
オブジェクトを指定した場合は、@object.cache_key
がキャッシュのキーとなる。ActiveRecord
のオブジェクトの場合、ID
や、updated_at
を元にキーが作成されるので、オブジェクトのupdated_at
が変更されると自動でキャッシュも更新される。
1 2 3 |
|
上記のように配列にした場合は、各オブジェクトに対して cache_key が呼ばれてそれを連結したものがキャッシュのキーになる。よって配列の順番や中身が変更されればキャッシュは更新される。
Russian Doll Caching(ロシアンドールキャッシング)とは
ネストされたフラグメントキャッシュの内側のキャッシュが更新されると、外側のキャッシュも更新してくれる機能。rails 4ならデフォルトで利用可能。
1 2 3 4 5 6 7 8 |
|
上記のようなネストされた構造のとき、membersに変更があったとしても、companyに変更がなければcompanyのキーが変更されず、キャッシュは更新されない。
しかし、memberのmodelに
1 2 3 |
|
と書いておくと、ネストされた親のキーにも更新が伝搬してくれるようになる。
テスト
70個の親テーブルと1440個の子テーブルをViewに出すことでキャッシュのテストを実行してみたら、
- キャッシュしていない場合
1
|
|
- キャッシュした場合
1
|
|
圧倒的な結果が出てきた。
参照
RailsにおけるCacheの概念と使い方
rails 4 の fragment cache(フラグメントキャッシュ)まとめ