【问题标题】:When doing fragment caching, should we cache active record queries as well?在进行片段缓存时,我们是否也应该缓存活动记录查询?
【发布时间】:2012-08-08 08:01:28
【问题描述】:

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

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

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

<% 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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      https://github.com/rovermicrover/FlagpoleSitta

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

      Best way to combine fragment and object caching for memcached and Rails

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

      【讨论】:

        猜你喜欢
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多