ページキャッシュ

Railsのページキャッシュ機能。Railsがニクいのは、こういうところにあります。

説明するまでもないですが、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で管理するかを選択できるようになってます。いずれにしても、こんなに簡単でいいのだろうか!


このブログでもキャッシュ機能を使ってはみたものの、宝のモチグサレであります。


コメント

コメントしてください

closed.