2

我引用了下面的引用,我可以从中看出一些意义:

“缓存的页面和片段通常取决于模型状态。缓存不关心哪些操作创建、更改或销毁相关模型。因此,使用普通观察者似乎是过期缓存的最佳选择。”

例如。我有一个更新模型的 resque worker。当模型更新/创建时,我需要一个片段缓存过期。这是扫地机做不到的。

但是,使用观察者意味着我需要在模型或 Resque 工作中使用类似的东西:

ActionController::Base.new.expire_fragment('foobar')

模型本身不应该知道缓存。这也将打破 MVC 原则,从而导致丑陋丑陋的结果。

4

4 回答 4

3

您可以通过在视图模板中将模型作为参数传递来自动过期缓存:

<% cache @model do %>
  # your code here
<% end %>

幕后发生的事情是创建了一个名为 [model]/[id]-[updated_at] 的缓存。模型有一个方法cache_key,它返回一个包含模型 id 和 updated_at 时间戳的字符串。当模型更改时,片段的 updated_at 时间戳将不匹配,缓存将重新生成。

这是一种更好的方法,您不必担心后台工作人员或使控制器/观察者中的缓存过期。

Ryan Bates 也有关于该主题的付费 Railscast:片段缓存

于 2012-05-26T01:55:12.013 回答
3

使用ActiveRecord::Observer监视模型更改。它可以使缓存过期。

于 2012-05-10T01:29:54.020 回答
2

一个好的和简单的解决方案是不要过期,而是用一个如果内容不同的话也会不同的密钥来缓存它。这是一个例子

<% cache "post-#{@post.id}", @post.updated_at.to_i do %>

当该帖子被更新或删除并且您再次获取它时,由于哈希值不同,它将错过缓存,因此它会过期并缓存新值。我认为这样做可能会遇到一些问题,例如,如果您使用的是 Rails 默认缓存,它将 html 文件创建为缓存,所以一段时间后您的公共目录中会出现很多文件,所以您最好设置您的应用程序使用 memcached 之类的东西,如果需要缓存其他人或类似的东西,它会管理删除旧缓存记录/页面/部分的内存。

于 2012-05-10T02:58:08.893 回答
0

我建议查看Rails 指南sweepers中的这一部分- 使用 Rails 缓存:概述

http://guides.rubyonrails.org/caching_with_rails.html#sweepers

看起来这可以在不专门创建大量缓存过期观察者的情况下完成。

于 2012-05-10T02:34:31.843 回答