説明するまでもないですが、HTMLキャッシュとは、CGIが生成したHTMLを保存しておいて、2回目以降のアクセスでは保存しておいたモノを出力する機能です。こうすれば、何回も同じCGIやSQLが動作しないので、Webサイトのパフォーマンスはものすごく向上します。
ちょっと昔は、キャッシュサーバなんて何百万円もしました。Railsでは、簡単に、無料でできます。
Railsのニクいところ
Railsを作ったDavid Heinemeier Hansson(DHH)さんは、きっとものすごく、「企業システムの何たるか」を知り尽くしている方なんだと思います。いろんな立場のエンジニアやお客さんを相手に働いてないと、こういったキャッシュ機能にまで気が回りませんよね。過去にキャッシュまで面倒見てくれるフレームワークって、あったのだろうか・・・。
Railsがプログラマに利便性を提供しているのは間違いありませんが、そればかりでなく、プログラマが接するお客さんのことまで考えている。こういうところが、RailsとDHHさんの並じゃないところです。
やりかた
Controllerクラスに、キャッシュしたいアクションを指定するだけです。キャッシュを削除する方法とあわせると、こんなふうになります。
def BlogController < ActionController
caches_page :rss #rssアクションの出力結果をキャッシュ
def rss
:
end
private
def expire_rss
expire_page :action => "rss" #rssアクションのキャッシュを失効
end
end
キャッシュしたHTMLは、ファイルシステムに保存されます。デフォルトでは、railsapp/publicですが、これだと使いづらいので、保存先を変えておきましょう。
environments/*.rbで、次のように設定しておけばいいと思います。
config.action_controller.page_cache_directory
= "pathToRailsapp/tmp/cache"
データに紐づくキャッシュ管理
キャッシュの新旧は、ほとんどの場合は、データの新旧に依存します。このブログもそうです。そういう場合は、モデルクラスを監視するクラス(Sweeper)で、キャッシュの管理をする方がスマートだと思います。
テーブルitemsとそのモデルクラスItemが既にあるとすると、
class ItemSweeper < ActionController::Caching::Sweeper
observe Item
def after_create
expire_page :contoller => "blog", :action => "rss"
end
end
class BlogController < ActionController
caches_page :rss
cache_sweeper :item_sweeper
end
これで、itemsにレコードが追加されたら、rssのキャッシュを失効します。
「何をもってキャッシュするか」を見極めて、Controllerで管理するか、Sweeperで管理するかを選択できるようになってます。いずれにしても、こんなに簡単でいいのだろうか!
このブログでもキャッシュ機能を使ってはみたものの、宝のモチグサレであります。