什么是清除Rails的缓存,而不扫墓的正确方法(What is the right way to c

2019-08-03 21:46发布

观察员和清扫器从Rails的4酷删除。 但是,什么是缓存的方式,清除缓存呢?

我读到关于俄罗斯套娃缓存。 它很好的和所有,但它仅涉及该视图渲染缓存。 它不会防止数据库被击中。

例如:

<% cache @product do %>
  Some HTML code here
<% end %>

你仍然需要得到@product从数据库获取其cache_key 。 因此,网页或动作缓存仍然可以防止不必要的负载非常有用。

我可以使用一些超时清除缓存,但有时什么,如果记录没有改变?

至少在清扫你有这方面的控制。 什么是/将是做高速缓存,并清除它的正确方法?

谢谢 ! :)

Answer 1:

欢迎来到计算机科学两个硬盘的问题,缓存失效的:)

你将不得不该手动处理由于用于当一个高速缓存对象,不像缓存视图可从它显示的对象来简单地获得,应该被无效是应用和状况相关的逻辑。

你为这个转到方法是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.cache.delete方法,仅仅需要一个缓存键并将其删除,导致错过你尝试获取它的下一次。 您也可以使用force: true有取迫使块的重新评估选项。 无论适合你。

这一切的科学就是调用Rails.cache.delete ,在天真的情况下,这将是对更新和删除单个实例,更新,删除了收集的任何成员上创建。 总会有蜜蜂角落的情况下,他们总是专用,所以我不能帮你多有。

我认为在这个答案,你会设置一些理智的缓存存储,像memcached的或Redis的。

还记得它添加到配置/环境/ development.rb:

config.cache_store = :null_store

或者你的开发环境将缓存,你会从挫折最终无毛。

更多参考阅读: 每个人都应该使用Rails中低级别的缓存和轨道API文档

还值得一提的是,功能性不从轨道4去除,仅仅提取到的宝石。 如果您需要或希望扫墓的全部功能,只需用其重新添加到您的应用程序gem 'rails-observers'在你的Gemfile线。 创业板既包含该从何处轨道4核心取出扫墓和观察员。

我希望你开始说helpt。



文章来源: What is the right way to clear cache in Rails without sweepers