使用memcache和Dalli进行Ruby on Rails缓存似乎不起作用

时间:2013-11-22 22:56:48

标签: ruby-on-rails caching memcached dalli

所以我在我的页面上实现了一些在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 %>
       ...

1 个答案:

答案 0 :(得分:4)

您的缓存密钥是问题(#cache的第一个参数)。您告诉Rails使用字符串"#{job}_big_2"来识别缓存的片段。要将Job实例插入到该字符串中,Ruby会在其上调用#to_s,从而生成您看到的#<Job:0xbbb61b4>段。但是这包含了object_id,每次加载记录时都会有所不同 - 这就是你没有得到任何缓存命中的原因。

如果JobActiveRecord::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记录的缓存密钥。