2013-07-15 42 views
4

我正嘗試使用獨立的工作來構建和操作緩存。我想盡可能保持這些工人的精益。 (不要使用導軌)手動生成Rails緩存鍵

我有困難鍛造軌生成緩存鍵

在我看來,我有這樣的:

cache ["comments", @ama] 

我試圖複製密鑰

updated_at = Time.parse(row['updated_at']) 
timestamp = updated_at.utc.strftime('%Y%m%d%H%M%S') 
cache_key = "views/comments/amas/#{row['id']}-#{timestamp}" 

將產生:

它下面產生
views/comments/amas/432-20121227010114 

該密鑰的緩存爲空。

要麼我沒有正確格式化我的密鑰,或者緩存丟失。我95%相信我正在尋找的緩存在那裏。

(我能推緩存,如「測試」的鍵,然後拿回來所以我知道的緩存工作。)

有用的參考文獻:

有用信息:

  • 緩存服務器不是本地的,是的,我指着它。
  • 即使密鑰不存在,當我在生產中加載頁面時,密鑰緩存將在當場構建。我曾嘗試過。
  • 使用Rails 4.0.0

回答

4

模板緩存鍵是這樣的:

views/projects/123-20120806214154/7a1156131a6928cb0026877f8b749ac9 
     ^class ^id ^updated_at ^template tree digest 

參考:http://api.rubyonrails.org/classes/ActionView/Helpers/CacheHelper.html#method-i-cache

+3

一個人如何產生如此重要呢? –

+0

在觀看'cache'方法是通過調用'上記錄或關係,例如cache_key'自動'緩存[ '側欄',@comments]'相同'緩存[ '側欄',@ comments.cache_key]'。見http://api.rubyonrails.org/classes/ActiveRecord/Integration.html#method-i-cache_key –

5

來實現低級別的緩存使用Rails的最有效的方法。 cache.fetch方法。如果可用,它將從緩存中讀取值;否則將執行傳遞給它的塊並返回結果:

可以手動設置從導軌控制檯緩存鍵(通過鍵入命令提示「軌道C」)

>> Rails.cache.fetch('answer') 
==> "nil" 
>> Rails.cache.fetch('answer') {1 + 1} 
==> 2 
Rails.cache.fetch('answer') 
==> 2 

考慮下面的例子。一個應用程序有一個帶有返回所有缺貨項目的類方法的產品模型,以及一個在競爭網站上查找產品價格的實例方法。通過這些方法返回的數據對於低級緩存來說是完美的:

# product.rb 

def Product.out_of_stock 
    Rails.cache.fetch("out_of_stock_products", :expires_in => 5.minutes) do 
    Product.all.joins(:inventory).conditions.where("inventory.quantity = 0") 
    end 
end 

def competing_price 
    Rails.cache.fetch("/product/#{id}-#{updated_at}/comp_price", :expires_in => 12.hours) do 
    Competitor::API.find_price(id) 
    end 
end 

我認爲這會對您有所幫助。

謝謝。

+2

如果添加源爲您解答這將是巨大的:https://devcenter.heroku.com/articles/緩存的策略 –