gpt4 book ai didi

ruby-on-rails - Rails 缓存将阻止客户端的请求

转载 作者:行者123 更新时间:2023-12-03 16:09:05 24 4
gpt4 key购买 nike

防止请求被缓存阻塞并自动重新生成新缓存

我们可以轻松制作 Rails cache ,并像这样设置过期时间

Rails.cache.fetch(cache_key, expires_in: 1.minute) do
`fetch_data_from_mongoDB_with_complex_query`
end

不知何故,当新请求进来时,会发生过期,并且请求将被阻塞。我的问题是,我怎样才能避免这种情况?基本上,我想在 Rails 制作缓存时将以前的缓存提供给客户端的请求。

如预期行为图所示,第二个请求会得到 cache 1但不是 cache 2 ,尽管 Rails 正在为 cache 2 做准备.因此,用户不必花费太多时间来制作新的缓存。那么,如何在没有用户请求触发的情况下自动重新生成所有缓存?

预期行为



缓存片段
     cache_key = "#{__callee__}"
Rails.cache.fetch(cache_key, expires_in: 1.hour) do
all.order_by(updated_at: -1).limit(max_rtn_count)
end

更新

如何在命令中获取所有缓存的键?

因为缓存查询可以由 start_date的组合生成, end_date , depature_at , arrive_at .

手动使所有缓存的键无效是不可能的。

我怎样才能获得所有缓存键,然后在 Rake 任务中刷新

最佳答案

使用 expiration很棘手,因为一旦缓存对象过期,您将无法获取过期值。

最佳做法是将缓存刷新过程与最终用户流量分离。您需要一个 rake 任务来填充/刷新您的缓存并将该任务作为 cron 运行。如果由于某种原因,作业没有运行,缓存将过期,您的用户将需要额外的时间来获取数据。

但是,如果您的数据集太大而无法一次刷新/加载所有数据,则必须使用不同的缓存过期策略(您可以在每次缓存命中后更新过期时间)。

或者,您可以禁用缓存过期并使用不同的指示符(例如时间)来确定缓存中的对象是最新的还是陈旧的。如果它是陈旧的,您可以使用异步 ActiveJob worker 将作业排队以更新缓存。陈旧的数据将返回给用户,缓存将在后台更新。

关于ruby-on-rails - Rails 缓存将阻止客户端的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31467626/

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