ruby 客戶端安裝:
gem install memcached
memcached一次取多條數據效率會高。
因爲緩存是個常見問題,故希望通過元編程解決這個問題。可以緩存任何函數的結果。並設置過期時間。
module MethodCached
def method_cached(fun,time)
define_method :"#{fun}_cached",->(*splat){str_key =(self.id.to_s+fun.to_s+splat.map{|o| o.to_s}.join("_"))
begin
return $cache.get str_key
rescue
$cache.set str_key,(res=self.send(fun,*splat)),time
return res
end
}
end
end
使用,在類裏面:
method_cached :function_name,10
10代表10秒過期
直接就可以調用 function_name_cached
extend 將模塊裏面的方法變成類方法
include 將模塊裏面的方法變成實例方法
module被extend之後,method_cached是類方法,裏面self指向類,故define_method定義的是實例方法(類對象的單例類define_method是定義類方法)在define_method的內部,self指向實例,self.send(fun)調用的是實例方法。
orders(:one).store_ontime_scores.build(:score=>3)
orders(:one).save
assert_equal 4.5,stores(:one).ontime_score_cached
sleep(1)
assert_equal 4.5,stores(:one).ontime_score_cached
sleep(6)
assert_equal 4.0,stores(:one).ontime_score_cached