Rails片段缓存如何工作?

时间:2015-09-27 17:51:50

标签: ruby-on-rails ruby-on-rails-3 caching dalli

我刚开始在生产应用程序中使用缓存来加快速度。我已经阅读了主要的Rails指南,各种博客,源代码本身等等。但是当谈到片段缓存时,我的头脑仍然不清楚:

在更新对象后销毁缓存时,是仅更新单个对象还是类?我认为只是单个对象。

以下是一个例子:

<% @jobs.each do |job| %>
   <% cache("jobs_index_table_environment_#{session[:merchant_id]}_job_#{job}") do %>
    stuff
   <% end %>
<% end %>

我在我的工作索引页面中使用上面的代码。每行都会显示用户想要的一些信息,一些CSS,可点击以查看单个作业等。

我在我的Job类(模型)中写了这个

after_save do
    Rails.cache.delete("jobs_index_table_environment_#{merchant_id}_job_#{self}")
  end

  after_destroy do
    Rails.cache.delete("jobs_index_table_environment_#{merchant_id}_job_#{self}")
   end

我希望更新或销毁个别作业对象从缓存中销毁,当然,新创建的作业在第一次弹出页面时会获得自己的缓存键。

我不用@jobs做俄罗斯娃娃的事情,因为这是我的“上帝”对象并且一直在变化。缓存几乎永远不会有用,因为集合可能会在一分钟内变形。

我的理解是否正确,在上面的视图中,如果我向第一页渲染了25个作业,我将使用缓存键在缓存中获得25个对象,然后如果我只更改第一个,则缓存值将被销毁,下次加载作业页面时,它将被重新缓存,而其他24页将被从缓存中拉出来?

1 个答案:

答案 0 :(得分:0)

我也是片段缓存的新手,我刚刚遇到了一个非常类似的用例,所以我觉得我的(有限的)知识足够新鲜,可以提供帮助。

Trosborn是正确的,您的终端会在您阅读时和您的写入时突出显示,这会显示您在缓存中有多少“点击”。它只应该在您更改对象时写入。根据我在上面看到的内容,您的删除仅删除单个记录。

但是,我认为有一种更简单的方法可以实现这一点,即将ActiveRecord对象传递给缓存,例如:

<% @jobs.each do |job| %>
   <% cache(job) do %>
    stuff
   <% end %>
<% end %>

阅读this post from DHH了解其工作原理。简而言之,当AR对象传递给缓存时,密钥不仅会生成在模型名称上,还会生成在idupdated_at字段上。

当内存耗尽时,过时的片段最终会被推出缓存,因此您无需担心删除旧的缓存对象。