【问题标题】:Ruby on Rails caching with memcache and Dalli doesn't seem to work使用 memcache 和 Dalli 进行 Ruby on Rails 缓存似乎不起作用
【发布时间】:2013-12-07 23:50:12
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails caching memcached dalli


    【解决方案1】:

    您的缓存键是问题所在(#cache 的第一个参数)。你告诉 Rails 使用字符串"#{job}_big_2" 来识别缓存的片段。要将Job 实例插入到该字符串中,Ruby 将在其上调用#to_s,从而产生您看到的#&lt;Job:0xbbb61b4&gt; 段。但这包含 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 记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多