cache_fu_find_hook を公開しました このエントリをはてなブックマークに登録

2009年09月02日

もりもりもりもり / , , , , ,

もりやまです。

先日公開したプロジェクトで初めて Memcached を使いました。

Rails から使う場合は cache_fu を使用するのが一般的だと思いますが、find ではなく get_cache という専用のメソッドを使用しないとキャッシュされません。

これはちょっとイヤだなぁと思ったので、find メソッドでキャッシュが効くようになるプラグインを作ってみました。

概要

cache_fu (旧 acts_as_cached) を拡張する、Ruby on Rails 用プラグインです。

find(id) や find_by_xxx(value) をフックして、get_cache が実行されるようにします。

リポジトリ

http://github.com/morimori/cache_fu_find_hook/tree/master

依存するライブラリ・プラグイン

インストール

$ cd $RAILS_ROOT
$ ./script/plugin install git://github.com/morimori/cache_fu_find_hook.git

設定

このプラグインが cache_fu の後にロードされるように、config/environment.rb を修正します。

Rails::Initializer.run do |config|
  ...
  config.plugins = [:cache_fu, :cache_fu_find_hook, :all]
  ...
end

使い方

モデル定義は cache_fu のまま、acts_as_cached で設定します。

データ取得は、cache_fu の場合は Model.get_cache(id) で取得しますが、Model.find(id) としてもキャッシュが効くようになります。

acts_as_cache に :find_by オプションを付けない場合

class User < ActiveRecord::Base   acts_as_cached end User.create User.find 1  ## キャッシュミスするので、find してキャッシュに追加します User.find 1  ## キャッシュに存在するのでキャッシュから取得します User.find :first, :conditions => {:id => 1}  ## この呼び方ではフックしないので、常にデータベースから取得します

acts_as_cached に :find_by オプションを付ける場合

acts_as_cached で find_by オプションを設定した場合は、Model.find_by_xxx(value) を呼んだ時にキャッシュを使用します。

この場合は Model.find(id) ではキャッシュされません。

class User < ActiveRecord::Base   acts_as_cached :find_by => 'employee_id'
end

User.create :employee_id => 127
User.find_by_employee_id 127  ## キャッシュミスするので、find してキャッシュに追加します
User.find_by_employee_id 127  ## キャッシュに存在するのでキャッシュから取得します
User.find :first, :conditions => {:employee_id => 127}  ## この呼び方ではフックしないので、常にデータベースから取得します

上手くキャッシュを使うにはロジックにも工夫が必要な部分はあるので、まったく意識する必要がないわけではないですが、このプラグインのおかげでキャッシュを使うことを意識する場面はかなり少なかったんじゃないかと思います。

しかし Memcached の効果は絶大だなぁと思いました。今後はどんどん活用していこうと思います。

  1. メモからはじめる情報共有 DocBase 無料トライアルを開始
  2. DocBase 資料をダウンロード

「いいね!」で応援よろしくお願いします!

このエントリーに対するコメント

コメントはまだありません。


トラックバック

we use!!Ruby on RailsAmazon Web Services

このページの先頭へ