もりやまです。
先日公開したプロジェクトで初めて 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 の効果は絶大だなぁと思いました。今後はどんどん活用していこうと思います。
このエントリーに対するコメント
- トラックバック
「いいね!」で応援よろしくお願いします!