この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
M.T.です。前開の書き込みから2ヶ月以上経ってしまいました。
ノウハウはできるだけ落としておきたいなーと思いながら、なかなか書く時間が作れません。
さて、今回は rails のキャッシュ、特に action_cache について書いてみます。
rails で提供されるキャッシング
rails にはデフォルトで 3 つのキャッシュ方法が提供されています。
ウェブ上で情報が多く、ゆえによく使われていそうな順に並べるとこんな感じでしょうか
(といっても、あくまでも実感で数値検証ないです)。
- ページキャッシュ
- フラグメントキャッシュ
- アクションキャッシュ
キャッシュ方法に応じた向き不向き
3 つも実装が用意されているということは、当然それぞれ得意な処理、不得意な処理があります。
ざっくりと言ってしまうと、こんな感じです。
ページをただ単にキャッシングして表示したいならページキャッシュ。
アクセスに応じた処理(○○さんこんにちは! みたいな)が必要ならフラグメントキャッシュ。
ページをただ単に表示したいだけだけど、フィルタは使いたいならアクションキャッシュ
速度効率で言うと、ページキャッシュが圧倒的によく、残りのふたつは処理に応じて異なるので、
アクセスが多いことが想定されているようであれば、早い段階でキャッシュ処理を考えた方が吉、です。
フィルタを使いたい状況とは?
さて、アクションキャッシュはフィルタが使いたい場合と書きましたが、では具体的にどのような状況が想定できるでしょうか。
最も利用される可能性が高いのは、携帯のキャリアに応じたキャッシュを作りたい場合、でしょう。
携帯を使う場合、rails では jpmobile を使うことが圧倒的に多いと思いますが、これはフィルタを利用しています。
例えばページキャッシュを使うと、最初に見られた端末のものでキャッシュされてしまうため、絵文字等正しく表示されない、文字化けが発生してしまうなどの問題が起きます。
キャリア別にページキャッシュをした場合でも、jpmobile のフィルタによる恩恵を受けられないため、パラメータの中に日本語等が入っていた場合、正常に動作しない可能性があります(すいません、未検証です)。
もしページ内にアクセスに応じた処理が入っている場合は、フラグメントキャッシュを使った方がよいと思いますが、その場合も、アクション内でデータを取得するときにキャリアに応じた処理を入れる必要があり、恐らく rails のライブラリをオーバーライドしないと難しいでしょう(すいません、こちらも未検証です、情報お持ちの方、ぜひぜひブクマコメントなどお寄せください)。
そんなときに使えるのがアクションキャッシュです。これは、あるコントローラ内のアクションで宣言すると、around_filter として適用され、before_filter でキャッシュ生存チェックを行い、もしキャッシュがあればアクションの処理を返さずにそのままキャッシュを表示、キャッシュがなければアクションを実行した後 after_filter でキャッシュを生成します。
と、ここまで書きましたが長くなってきたので、実際にどのような処理が行われているのか、キャリアごとにキャッシュするにはどうしたらよいのか、また次回書きたいと思います。今度こそもっと早く書くぞっ!