[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]