所以我在我的页面上实现了一些在rails 3.3上运行的缓存,但是当我查看生产日志时,我看到了:
Read fragment views/#<Job:0xbbb6970>_big_2 (0.8ms)
Write fragment views/#<Job:0xbbb6970>_big_2 (0.5ms)
Read fragment views/#<Job:0xbbb65d8>_big_2 (0.5ms)
Write fragment views/#<Job:0xbbb65d8>_big_2 (0.6ms)
Read fragment views/#<Job:0xbbb61b4>_big_2 (0.6ms)
Write fragment views/#<Job:0xbbb61b4>_big_2 (0.4ms)
Rendered shared/_jobslist.html.erb (88.5ms)
我不确定这应该是这样:)据我所知,一旦片段保存在缓存中,它应该一直读取。我指定了30分钟的到期时间。
<% jobs.each_with_index do |job, i| %>
<% cache("#{job}_big_2", :expires => 30.minutes) do %>
...
答案 0 :(得分:4)
您的缓存密钥是问题(#cache
的第一个参数)。您告诉Rails使用字符串"#{job}_big_2"
来识别缓存的片段。要将Job
实例插入到该字符串中,Ruby会在其上调用#to_s
,从而生成您看到的#<Job:0xbbb61b4>
段。但是这包含了object_id,每次加载记录时都会有所不同 - 这就是你没有得到任何缓存命中的原因。
如果Job
是ActiveRecord::Base
的后代,则可以使用#cache_key
方法,该方法将生成一个包含记录的记录ID和updated_at
时间戳的字符串,以生成该记录唯一的密钥,但如果更新记录将重新生成该密钥:
<% jobs.each_with_index do |job, i| %>
<% cache("#{job.cache_key}_big_2", :expires => 30.minutes) do %>
...
Read fragment views/jobs/1234-20130614084704_big_2 (0.8ms)
...
如果Job
不是AR::Base
模型,那么您需要实施类似的方法来生成一个唯一标识您的Job
记录的缓存密钥。