2

我正在尝试在 memcache 中为已批准的页面保存大量 id 和永久链接,这样我就不必多次访问数据库来获取相同的数据。

我的代码:

if Rails.cache.exist?("ids_and_permalinks_array")
  data = Rails.cache.fetch("ids_and_permalinks_array")
else
  data = []

  Page.approved.select('id, permalink').find_each { |f| data << f }

  Rails.cache.write("ids_and_permalinks_array", data, :expires_in => 12.hours)
end

approvedonPage是一个简单的where(:approved => true),而 data 是一个大型对象子集数组,例如#<Page id: 1, permalink: "page-permalink-1">(该数组大约有 50,000 个对象)。

线路Rails.cache.write返回false从控制台运行时Cache write: ids_and_permalinks_array ({:expires_in=>43200 seconds})

所以,日志说它正在写入缓存,但Rails.cache.fetch("ids_and_permalinks_array")返回nil.

建议?有什么明显的我做错了吗?

编辑

我也试过这个,但仍然没有得到写入缓存的值:

Rails.cache.fetch("ids_and_permalinks_array", :expires_in => 12.hours, :race_condition_ttl => 10.minutes) do
  Page.approved.select('id, permalink').find_each { |p| data << p }
end

** 更新 2 **

Rails.logger.info("\n#{Rails.cache.exist?("ids_and_permalinks_array")\n")在方法调用的开头和结尾添加了这段代码。每次,在方法调用的开头,它都会记录false并在最后记录true......所以,它正在工作,但它只是为此设置方法调用的线程/实例?

4

1 回答 1

2

当您使用 aRails.cache.fetch时,给定的块需要返回预期值。在:

Rails.cache.fetch("ids_and_permalinks_array", :expires_in => 12.hours, :race_condition_ttl => 10.minutes) do
  Page.approved.select('id, permalink').find_each { |p| data << p }
end

块的结果是nil,因为那是 的返回值find_each

尝试这样的事情:

Rails.cache.fetch("ids_and_permalinks_array", :expires_in => 12.hours, :race_condition_ttl => 10.minutes) do
  [].tap do |data|
    Page.approved.select('id, permalink').find_each { |p| data << p }
  end
end

使用 tap 将确保结果数组作为返回值传递给 fetch 块。

于 2013-05-31T17:32:00.687 回答