Rail片段缓存如何使您的应用受益,即阻止数据库调用?

问题描述 投票:2回答:1

我的页眉/页脚中的信息来自我的数据库中的一堆字典表,并且数据将很少发生变化。我认为这是缓存的绝佳机会,因此就呈现页眉/页脚而言,每个页面都不会触及数据库。

Rails指南给出了一个片段缓存的例子,所以我想我的导航链接就像......

<% @categories.each do |category| %>
  <% cache category do %>
    <li class="nav-link">
      <%= link_to category.name, category_path(category) %>
    </li>
  <% end %>
<% end %>

但我不明白这是如何阻止与数据库联系或优化任何事情。控制器在视图呈现之前调用@categories,这意味着每个页面请求都会进行SQL查询...某些HTML正在被缓存,但是渲染过程真的是一个重要的节省,即使对于更大的片段?我觉得数据库的压力是你真正想要限制的,特别是在处理大量并发流量时。

什么是页脚/导航部分等适当的缓存策略。

ruby-on-rails ruby caching web optimization
1个回答
3
投票

片段缓存的Rails指南示例仅指缓存生成的视图以显示对象,而不是查询,这就是为什么您无法查看缓存查询的位置,因为它没有。

您可以使用低级缓存来缓存@categories查询https://guides.rubyonrails.org/caching_with_rails.html#low-level-caching

它可以缓存任何类型的信息,所以,你可以有类似的东西

class Category < ActiveRecord::Base
  def self.for_navbar
    Rails.cache.fetch("#{nav_cache_key}/categories_for_navbar", expires_in: 1.week) do
      self.whatever_scope_you_need
    end
  end
end

您需要更改的是用于标识缓存的nav_cache_key var。我不确定这是一个最佳实践,但是我会在第一次使用当前time_stamp时设置一个类变量,并在每次擦除缓存时更新它。

就像是

def self.navbar_cache_key
  @@navbar_cache_key ||= Time.now
end

after_update :change_cache_key

def change_cache_key
  @@navbar_cache_key = Time.now
end

这样,每次更新类别时,它都会更改类的@@navbar_cache_key,并且将为新密钥更新缓存。我不确定缓存需要更新的真实条件是什么,也许after_update回调不是最好的,或者你需要一些额外的操作。

这将仅缓存查询(不确定是否需要缓存数组或缓存查询的工作方式相同,可能最后需要.to_a),如果要缓存li元素,仍然可以使用片段缓存。

我想你甚至可以缓存类别的完整html,因为低级缓存接受任何类型的信息,你只需找到使用Rails.cache.fetch的正确位置和正确的地方来保存/更新缓存密钥。

© www.soinside.com 2019 - 2024. All rights reserved.