为什么我的片段缓存写得这么多?

时间:2015-10-19 16:09:02

标签: ruby-on-rails caching heroku memcached

我在Rails 3中使用片段缓存,几乎每次读取都会看到写入。当单个记录发生变化时,我只有一个删除缓存:

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

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

我在缓存中观察到的是,几乎每条记录都是在每次请求时读取和写入的。这不是我对缓存如何工作的理解,所以很明显我搞砸了一些东西。

以下是评论片段:

2015-10-19T16:06:39.939351+00:00 app[web.2]: Read fragment views/job_comments_comment_#<Comment:0x007f9aa9b69860> 1.7ms
2015-10-19T16:06:39.955819+00:00 app[web.2]: Read fragment views/job_comments_comment_#<Comment:0x007f9aa9b69450> 10.1ms
2015-10-19T16:06:39.945527+00:00 app[web.2]: Write fragment views/job_comments_comment_#<Comment:0x007f9aa9b69860> 1.9ms
2015-10-19T16:06:39.999099+00:00 app[web.2]: Write fragment views/job_comments_comment_#<Comment:0x007f9aa9b69450> 42.6ms

据我所知,读取和写入的两个对象是相同的(读取和写入的集合之间的内存是相同的)。

作为评论(在这种情况下),还没有改变,为什么要写入缓存?难道不应该只读它吗?

编辑:

认为我现在更了解它 - 我偶然发现了一个有这个精彩片段的博客:

  

您可以将数组提供给缓存,缓存密钥将基于a   数组中所有内容的连接版本。这很有用   使用相同ActiveRecord对象的不同缓存。

圣牛在我的脑海中清除了这些事情。

由于各种原因,我在多个视图上重复使用相同的AR对象,我发现了你不能简单的困难方法:

<% cache(ar) do %>

在每个页面上,因为它会带来HTML和样式。所以我将每个缓存键重命名为:

<% cache("this_specific_page_#{ar}") do %>

但是通过变量插值,似乎每个缓存键都是唯一的。

将它作为args数组传递给缓存方法使其按预期运行(我认为 - 仍然在测试)。

所以现在我有:

<% cache(["this_specific_page", session[:key], ar]) do %>

这会根据需要将每页的对象分开,但它维护单个ar记录就是这样 - 没有我之前与之连接的字符串。

0 个答案:

没有答案