所以我在运行在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 %>
...
您的缓存键是问题所在(的第一个参数#cache
)。您要告诉Rails使用字符串标识缓存的片段"#{job}_big_2"
。要将Job
实例插值到该字符串中,Ruby将对其进行调用#to_s
,生成#<Job:0xbbb61b4>
您所看到的段。但这包含object_id,每次加载记录时,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
记录的缓存键。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句