5

我正在尝试使用孤立的工作人员来构建和操作我的缓存。我想让这些工人尽可能地精益求精。(不要使用导轨)

我很难伪造 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”之类的键来推送缓存,然后将其取回。所以我知道缓存正在工作)

有用的参考资料:

有用的信息:

  • 缓存服务器不是本地的,是的,我指的是它。
  • 即使密钥不存在,当我在生产中加载页面时,密钥和缓存也会在现场构建。我试过了。
  • 使用 Rails 4.0.0
4

2 回答 2

7

实现低级缓存最有效的方法是使用 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

我想这对你会有帮助。

谢谢。

于 2013-07-16T15:01:24.283 回答
6

模板缓存键如下所示:

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

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

于 2013-07-16T14:23:19.343 回答