rails:2200
From: Takashi Seki <hawk.seki@n...>
Date: Tue, 29 May 2007 23:34:34 +0900
Subject: [rails:2200] DBにflagment cacheを保存するためのクラス
関です。 (負荷分散目的などで)複数サーバに分散したrails間で flagment cacheを(ERBを使わずに)共有するため、 DBにキャッシュを保存するクラスを書いてみました。 (すでにあるような予感満点なのですが、見つけられなかったので・・・) 一応動いているようなのですが、 皆さんにもみていただいて、 何からアドバイスをいただければと思い ポストいたしました。 どうぞよろしくお願い致します。 ----- db_store.rbここから #======================================= # db_cache.rb # SEKI, Takashi # 2007-5-29 v0.9 initial #--------------------------------------- class DBStore def initialize(store_klass = CacheStore) @store_class = store_klass end def read(name, options=nil) cache = @store_class.find_by_name_and_enable(name, true) if (cache) return cache.value else return nil end end def write(name, value, options=nil) cache = @store_class.find_or_create_by_name(name) @store_class.update(cache.id, :enable => true, :value => value) end def delete(name, options=nil) cache = @store_class.find_by_name_and_enable(name, true) if (cache) @store_class.update(cache.id, :enable => false) end end def delete_matched(matcher, options=nil) if (options) ar = @store_class.find(:all, :select => 'id, name, enable', :conditions => options[:conditions]) else ar = @store_class.find(:all, :select => 'id, name, enable') end ar.each {|cache| if (cache.name =~ matcher) @store_class.update(cache.id, :enable => false) end } end end #--------------------------------------- =begin ------------------ 下記のモデルが必要 ------------------ class CacheStore < ActiveRecord::Base end class CreateCacheStores < ActiveRecord::Migration def self.up create_table :cache_stores do |t| t.column :name, :string t.column :value, :binary t.column :enable, :boolean end add_index :cache_stores, [:name, :enable] add_index :cache_stores, :name add_index :cache_stores, :enable end def self.down drop_table :cache_stores end end -------------------------- environment.rbに下記を追加 -------------------------- ActionController::Base.fragment_cache_store = DBStore.new ------------------------- expire_fragmentの拡張仕様 ------------------------- expire_fragment(/page_.*/, :conditions => ['name like ?', "page_%"]) などの様に、:conditions を指定可能 =end ----- db_store.rbここまで =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 関 隆 (SEKI, Takashi) --------------------------------------- [E-mail] hawk.seki@n... =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -- ML: rails@r... 使い方: http://QuickML.com/