gpt4 book ai didi

ruby-on-rails - 什么是在没有清除程序的情况下清除Rails中缓存的正确方法

转载 作者:行者123 更新时间:2023-12-04 04:06:25 25 4
gpt4 key购买 nike

观察者和清扫器已从Rails 4中移除。
但是,缓存和清除缓存的方式又是什么呢?

我读了有关俄罗斯娃娃缓存的文章。一切都很好,但仅涉及 View 渲染缓存。它不会阻止数据库被命中。

例如:

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

您仍然需要从数据库获取 @product以获得其 cache_key。因此,页面或操作缓存仍然可以用于防止不必要的加载。

我有时可以使用一些超时来清除缓存,但是如果记录没有更改怎么办?

至少对于清扫器,您可以控制该方面。什么是/将使用 正确的方法来进行缓存和清除它?

谢谢 ! :)

最佳答案

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

您必须手动处理该问题,因为与可以仅从其显示的对象简单派生的缓存 View 不同的是,缓存对象何时应被禁用的逻辑取决于应用程序和情况。

为此,您的goto方法是Rails.cache.fetch方法。 Rails.cache.fetch接受3个参数;缓存键,选项哈希和块。首先,它尝试根据 key 读取有效的缓存记录;如果该键存在且尚未过期,它将从缓存中返回该值。如果找不到有效的记录,则从块中获取返回值,然后使用您指定的键将其存储在缓存中。

例如:

@models = Rails.cache.fetch my_cache_key do
Model.where(condition: true).all
end

这将缓存该块并重用结果,直到(tm)使 key 无效,从而迫使重新评估该块。还要注意方法链末尾的 .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

否则您的开发环境将被缓存,并且最终将因挫败而变得一头雾水。

有关更多引用,请阅读: Everyone should be using low level caching in RailsThe rails API docs

还值得注意的是,功能并没有从Rails 4中删除,只是提取到了gem中。如果您需要或想要清除程序的全部功能,只需在Gemfile中使用 gem 'rails-observers'行将其添加回您的应用程序即可。该 gem 包含从Rails 4核心中删除的清扫程序和观察程序。

希望对您有所帮助。

关于ruby-on-rails - 什么是在没有清除程序的情况下清除Rails中缓存的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13822614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com