我在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记录就是这样 - 没有我之前与之连接的字符串。