我正在尝试使用隔离的工作程序来构建和操作我的缓存。我想让这些工人尽可能地精益求精。 (不要使用铁轨)
我无法伪造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%的信心我正在寻找缓存。
(我可以使用诸如'test'之类的密钥推送缓存,然后将其恢复。所以我知道缓存正在运行)
有用的参考资料:
有用的信息:
答案 0 :(得分:5)
模板缓存键如下所示:
views/projects/123-20120806214154/7a1156131a6928cb0026877f8b749ac9
^class ^id ^updated_at ^template tree digest
参考:http://api.rubyonrails.org/classes/ActionView/Helpers/CacheHelper.html#method-i-cache
答案 1 :(得分:5)
实现低级缓存的最有效方法是使用Rails.cache.fetch方法。如果可用,它将从缓存中读取一个值;否则它将执行传递给它的块并返回结果:
您可以从rails控制台手动设置缓存键(通过在命令提示符下键入“rails c”)
>> Rails.cache.fetch('answer')
==> "nil"
>> Rails.cache.fetch('answer') {1 + 1}
==> 2
Rails.cache.fetch('answer')
==> 2
考虑以下示例。应用程序具有Product类型,其具有返回所有缺货商品的类方法,以及在竞争网站上查找产品价格的实例方法。这些方法返回的数据非常适合低级缓存:
# 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
我认为这会对你有所帮助。
感谢。