Rails片段缓存策略

时间:2012-02-16 10:45:34

标签: ruby-on-rails caching ruby-on-rails-3.1 memcached

我有一个网站我正在实施一些缓存。

在可能的情况下,我使用了动作缓存,并且我有清扫工具,以便在创建/更新模型时使必要的操作失效。

在受caches_action影响的视图中,我还有片段缓存了一些部分,以便在部分内部我有类似的东西:

<% cache('video_content') do %>
   Some content here
<% end %>

在我的video_sweeper中,我试图将此片段过期:

expire_fragment('video_content')

这个片段虽然没有到期。

因为我已经使用caches_action,因为某种原因会忽略片段吗?即我需要在使用caches_action或片段缓存之间做出选择吗?

如果是这种情况,我需要使这部分出现的每个动作视图到期,这意味着我的扫地机会变得非常复杂,更不用说维护头痛了。

所以我的问题很大,为什么我的片段缓存在从我的清扫工调用时不会过期,是因为我也在使用caches_action

更新 进一步挖掘我的日志,我实际上可以看到清扫器正在使我的片段到期。

Expire fragment views/video_content (0.7ms)

但是,在到期之前在控制台中玩游戏,片段似乎不存在。

ruby-1.9.2-p136 :004 > Rails.cache.exist?('views/video_content')
 => false

同样,这让我觉得因为我使用caches_action部分将很少被击中,除非动作过期,否则将被缓存。

2 个答案:

答案 0 :(得分:1)

动作缓存在技术上也是片段缓存的类型,它包装了你的片段。因此,您的片段可能会过期,但直到动作缓存过期才会显示。

因此,如果希望您的片段过期,您也需要使该操作过期。但片段缓存并非没有目的。如果操作过期,将使用缓存的片段。

答案 1 :(得分:0)

动作缓存会为您缓存完整的操作。因此,在控制器动作(例如'show_video')上使用动作缓存并在同一视图“show_video”上添加片段缓存不会产生太大影响。您应该明智地使用它们。

另外,正如您所说,片段缓存过期但是当调用该操作时,将呈现缓存操作。因此,在您的情况下,您还需要使动作缓存失效。

我建议你仔细阅读格雷格波拉克的视频演员 check this out