我已经采用了下面的引用,我可以在其中看到一些意义:
"缓存页面和片段通常取决于模型状态。缓存不关心哪些操作创建,更改或破坏相关模型。所以使用普通的观察者似乎是我过期缓存的最佳选择。"
例如。我有一个更新模型的resque工作者。在更新/创建模型时,我需要片段缓存到期。这不能用扫地机完成。
但是,使用观察者意味着我需要在模型或Resque工作中使用类似的东西:
ActionController::Base.new.expire_fragment('foobar')
模型本身不应该知道缓存。这也将打破MVC原则,这将导致丑陋的丑陋结果。
答案 0 :(得分:3)
使用ActiveRecord::Observer观察模型更改。它可以使缓存失效。
答案 1 :(得分:3)
您可以通过在视图模板中将模型作为参数传递来自动使缓存过期:
<% cache @model do %>
# your code here
<% end %>
幕后发生的事情是创建名为[model] / [id] - [updated_at]的缓存。模型有一个方法cache_key
,它返回一个包含模型ID和updated_at时间戳的字符串。当模型更改时,片段的updated_at时间戳将不匹配,缓存将重新生成。
这是一种更好的方法,您不必担心后台工作人员或控制器/观察者中的缓存过期。
Ryan Bates还有关于该主题的付费Railscast:Fragment Caching
答案 2 :(得分:2)
一个好的和简单的解决方案是不会过期,而是使用一个密钥来缓存它,如果内容不同则会有所不同。这是一个例子
<% cache "post-#{@post.id}", @post.updated_at.to_i do %>
当该帖子被更新或删除并再次获取它时,它将错过缓存,因为哈希是不同的,因此它会过期并缓存新值。我认为你可以通过这样做遇到一些问题,例如,如果你使用Rails默认缓存创建html文件作为缓存,那么一段时间后你最终会在你的公共目录中有很多文件,所以你最好设置你的应用程序使用像memcached这样的东西,管理内存删除旧的缓存记录/ pages / parcials,如果需要缓存其他人或类似的东西。
答案 3 :(得分:0)
我建议您在Rails Guide - Caching with Rails: An overview
中的sweepers
上查看此部分
http://guides.rubyonrails.org/caching_with_rails.html#sweepers
看起来这可以在没有专门创建大量缓存过期观察者的情况下完成。