0

如果一个是片段缓存页面的一部分,该页面具有从控制器中的模型加载的内容。这些查询是否也应该被缓存?

这是否意味着将有两种类型的缓存:片段和活动支持两种不同类型数据的缓存?

例如。在我看来,我可以:

<% cache 'videos_and_photos', :expires_in => 24.hours do %>
  <div id="videos">
    <% @videos.each do |video| %>
      ...
    <% end %>
  </div>

  <div id="photos">
    <% @photos.each do |photo| %>
       ...
    <% end %>
  </div>
<% end %>

在控制器中:

Rails.cache.fetch('videos', :expires_in => 24.hours) do
  @videos = Video.where(...)
end

Rails.cache.fetch('photos', :expires_in => 24.hours) do
  @photos = Photo.where(...)
end

我对此的唯一看法是,如果一个缓存首先过期,那么数据将显示不一致。有没有更好的方法来解决这个问题?

4

2 回答 2

1

通常不应在视图中使用业务逻辑或查询,但在这种情况下可能会出现异常。只需为您的查询定义一个特殊的方法,例如Video.your_method,并在视图中使用它。这似乎是最干净的方法:

<% cache 'videos_and_photos', :expires_in => 24.hours do %>   
  <div id="videos">
    <% Video.your_method.each do |video| %>
      ...
    <% end %>   
  </div>

否则,您将缓存属于两个不同位置的数据,这可能会导致不可预测的结果。

于 2012-08-08T10:13:01.900 回答
0

我创建了一个 gem 以避免在缓存存在时查询数据库。

https://github.com/rovermicrover/FlagpoleSitta

它将所有数据库调用存储在 Procs 中,然后仅在缓存不存在时调用它们。然后,当对象更新时,它会使所有相关的缓存失效。我从以下 stackoverflow 帖子中得到了这个想法。

为 memcached 和 Rails 组合片段和对象缓存的最佳方式

虽然我的 gem 可能已经过时了,而且我仍然认为它处于 beta 测试阶段,但上述堆栈溢出帖子中的总体策略应该会有所帮助。

于 2012-08-08T19:20:36.810 回答