我正在尝试在 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
approved
onPage
是一个简单的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
......所以,它正在工作,但它只是为此设置方法调用的线程/实例?