2013-07-17 48 views
2

我存儲數據庫查詢結果在內存緩存兩種不同的memcache實例在Heroku。我在heroku上使用memcachier插件。例如,如果我有一個緩存用戶在memcache中的任務。我做這樣的事情:如何使用在Heroku

def cached_tasks 
    Rails.cache.fetch([:users, id, :tasks], :expires_in => 12.hours) { tasks.to_a } 
end 

這工作完全正常,但我想用兩個不同的內存緩存實例來存儲數據。

爲什麼?頻繁使用非常頻繁,基本數據的變化

一個又一個的那些大數據對象和那些永遠不會改變或很少。

如何使用兩個不同的實例,並指定cached_tasks應存放在memcache_instance_1和其他類似cached_images應存放在memcache_instance_2

爲什麼不使用同一個:

因爲有時候我需要刷新整個緩存,並且會刷新我不想要的大數據。

有什麼建議嗎?

+0

爲什麼不能服務於作爲爲static大很少變化c資產? –

+0

你有沒有看到上面的評論? –

+0

@MichaelSzyndel是的。但這些東西是用戶特定的,每天我都會得到大約400-500個新用戶,並且那裏有像他們的朋友列表等數據。檢查接受的答案。 –

回答

3

聲明三個新env變量爲您的Heroku應用

BIG_MEMCACHIER_SERVERS 
BIG_MEMCACHIER_USERNAME 
BIG_MEMCACHIER_PASSWORD 

config\initializers目錄添加一個名爲big_cache.rb文件:

module Rails 
    def self.big_cache 
    @big_cache ||= ActiveSupport::Cache::DalliStore.new(
     (ENV["BIG_MEMCACHIER_SERVERS"] || "").split(","), 
     :username => ENV["BIG_MEMCACHIER_USERNAME"], 
     :password => ENV["BIG_MEMCACHIER_PASSWORD"]) 
    end 
end 

現在,您可以按如下方式訪問第二緩存:

Rails.big_cache.fetch(..) 
0

我會做的是嘗試定義什麼從事情,我很緩存實際上是一些需要高速緩存,或者它實際上需要一些有壽命持久性。

我會離開Rails內部緩存系統做它最擅長的事情:頁面,動作和片段緩存,並使用另一個持久性引擎(如Redis)來保存和維護您所討論的那些大對象(實現這個建議是一個完全不同的問題)。

注意,Redis的還允許設置上的鍵一個TTL(生存時間) - 因此它可以提供你想要這樣的生活持續性有限。