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/