Cacheクラス

前回作った、configクラスを使いつつ、シングルトン化し、
ブロックの結果をキャッスする関数を生やしたかんじ。

ソース

require 'singleton'
require 'memcache'
require 'bei/config'
require 'pp'

module Bei
  class Cache < Memcache
  include Singleton

  def initialize
    super ( { :servers => Bei::Config.instance.get(:memcached_servers) } )
  end


  def cacheable(key,expire=60*3)
    raise "NO_BLOCK_ERROR" unless block_given?

    unless( value = self.get(key) )
      #pp 'from value'
      value = yield()
      self.set(key,value,expire)
    else
      #pp 'from cache'
    end

    return value
  end

  end

使い方

こんな
かん

 cache = Bei::Cache.instance() 
# Memcache の継承なので、既にある関数はそのまま使える。
 cache.set('hi','hihihi')
 hi = cache.get('hi')

 # blockからデータ取得
 my_data = cache.cachable('my/3/data', 60 * 1) { { :user_id => 3 } } # 3 

 # memcachedからデータ取得
 my_data = cache.cachable('my/3/data', 60 * 1) { { :user_id => 2 } } # 3 (2じゃない)