我的页眉/页脚中的信息来自我的数据库中的一堆字典表,并且数据将很少发生变化。我认为这是缓存的绝佳机会,因此就呈现页眉/页脚而言,每个页面都不会触及数据库。
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正在被缓存,但是渲染过程真的是一个重要的节省,即使对于更大的片段?我觉得数据库的压力是你真正想要限制的,特别是在处理大量并发流量时。
什么是页脚/导航部分等适当的缓存策略。
片段缓存的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
的正确位置和正确的地方来保存/更新缓存密钥。