2

所以我在运行在 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 %>
       ...
4

1 回答 1

4

您的缓存键是问题(的第一个参数#cache)。您正在告诉 Rails 使用 string 识别缓存的片段"#{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记录的缓存键。

于 2013-11-25T17:26:25.140 回答