没有扫描程序在Rails中清除缓存的正确方法是什么
观察者和扫墓者从Rails 4中删除。酷。 但是缓存和清除缓存的方法是什么呢?
我读到了关于俄罗斯娃娃的缓存。 它很好,除了它只涉及视图渲染缓存。 它不会阻止数据库被击中。
例如:
Some HTML code here
您仍然需要从db获取@product
以获取其cache_key
。 因此,页面或操作缓存仍可用于防止不必要的负载。
我有时可以使用一些超时来清除缓存,但是如果记录没有改变会怎样?
至少对于扫地机你可以控制这方面。 什么是/将是正确的缓存和清除方法?
谢谢 ! 🙂
欢迎来到计算机科学中的两个难题之一,缓存失效:)
您必须手动处理它,因为缓存对象的逻辑与缓存视图不同,缓存视图可以简单地从它显示的对象派生,应该是无效的依赖于应用程序和情境。
你转到这个方法是Rails.cache.fetch
方法。 Rails.cache.fetch
有3个参数; 缓存键,选项哈希和块。 它首先尝试根据密钥读取有效的缓存记录; 如果该密钥存在且尚未过期,则它将从缓存中返回该值。 如果找不到有效记录,则它会从块中获取返回值,并使用指定的密钥将其存储在缓存中。
例如:
@models = Rails.cache.fetch my_cache_key do Model.where(condition: true).all end
这将缓存块并重用结果,直到某些事件(tm)使密钥无效,从而强制重新评估该块。 还要注意方法链末尾的.all
。 通常情况下,Rails会返回一个缓存的ActiveRecord关系对象,然后当你第一次尝试使用@models
时会对它进行评估,整齐地回避缓存。 .all
调用强制Rails急切加载记录并确保它是我们缓存的结果,而不是问题。
所以现在你已经开始使用所有缓存并且再也没有与数据库通信,我们必须确保覆盖另一端,使缓存无效。 这是通过Rails.cache.delete
方法完成的,该方法只需要一个缓存键并将其删除,从而在下次尝试获取时导致错过。 您还可以使用force: true
选项和fetch强制重新评估块。 哪个适合你。
所有这一切的科学都是调用Rails.cache.delete
,在天真的情况下,这将是对单个实例进行更新和删除以及更新,删除,创建集合的任何成员。 总会有蜂角落的情况,它们总是特定于应用,所以我无法帮助你。
我在这个答案中假设您将设置一些理智的缓存存储,如memcached或Redis。
还记得将它添加到config / environments / development.rb:
config.cache_store = :null_store
或者你的开发环境会缓存,你最终会因挫折而无毛。
如需进一步参考,请阅读: 每个人都应该在Rails和rails API文档中 使用低级缓存
值得注意的是,function不会从Rails 4中删除,只是提取到gem中。 如果您需要或希望扫描仪的全部function,只需将其添加回您的应用程序,并在Gemfile中使用gem’trail gem 'rails-observers'
行。 那个gem包含从Rails 4核心中删除的清扫工和观察者。
我希望你能帮助你开始。