没有扫描程序在Rails中清除缓存的正确方法是什么

Hap*_*off 9 caching ruby-on-rails ruby-on-rails-4

从Rails 4中删除观察者和清扫器.但是缓存和清除缓存的方法是什么呢?

我读到了关于俄罗斯娃娃的缓存.它很好,除了它只涉及视图渲染缓存.它不会阻止数据库被击中.

例如:

<% cache @product do %>
  Some HTML code here
<% end %>
Run Code Online (Sandbox Code Playgroud)

你仍然需要@product从数据库中获取它cache_key.因此,页面或操作缓存仍可用于防止不必要的负载.

我有时可以使用一些超时来清除缓存但是如果记录没有改变会怎样?

至少对于扫地机你可以控制这方面.什么是/将是正确的缓存和清除方法?

谢谢 !:)

Jon*_*son 8

欢迎来到计算机科学中的两个难题之一,缓存失效:)

您必须手动处理它,因为缓存对象的逻辑与缓存视图不同,缓存视图可以简单地从它显示的对象派生,应该是无效的依赖于应用程序和情境.

你转到这个Rails.cache.fetch方法的方法.Rails.cache.fetch需要3个参数; 缓存键,选项哈希和块.它首先尝试根据密钥读取有效的缓存记录; 如果该密钥存在且尚未过期,则它将从缓存中返回该值.如果找不到有效记录,则它会从块中获取返回值,并使用指定的密钥将其存储在缓存中.

例如:

@models = Rails.cache.fetch my_cache_key do
  Model.where(condition: true).all
end
Run Code Online (Sandbox Code Playgroud)

这将缓存块并重用结果,直到某些事件(tm)使密钥无效,从而强制重新评估该块.另请注意.all方法链的末尾.通常情况下,Rails会返回一个将被缓存的ActiveRecord关系对象,然后在您@models第一次尝试使用时会对其进行评估,从而巧妙地回避缓存.该.all呼叫力量轨渴望负荷记录,并确保它是我们缓存的结果,而不是问题.

因此,既然您已经获得了所有缓存并且再也没有与数据库通信,那么我们必须确保覆盖另一端,使缓存无效.这是通过Rails.cache.delete简单地获取缓存键并将其删除的方法完成的,从而在下次尝试获取时导致错过.您还可以使用force: true带有fetch 的选项来强制重新评估块.哪个适合你.

这一切的科学就是在哪里调用Rails.cache.delete,在天真的情况下,这将是对单个实例的更新和删除以及更新,删除,创建集合的任何成员.总会有蜂角落的情况,它们总是特定于应用,所以我无法帮助你.

我在这个答案中假设您将设置一些理智的缓存存储,如memcached或Redis.

还记得将它添加到config/environments/development.rb:

config.cache_store = :null_store
Run Code Online (Sandbox Code Playgroud)

或者你的开发环境会缓存,你最终会因挫折而无毛.

如需进一步参考,请阅读:每个人都应该在Railsrails API文档中使用低级缓存

值得注意的是,功能不会从Rails 4中删除,只是提取到gem中.如果您需要或希望gem 'rails-observers'扫描仪的全部功能,只需将其添加回您的应用程序,并在Gemfile中添加一行.那个宝石包含从Rails 4核心中删除的清扫工和观察者.

我希望你能帮助你开始.