Rails缓存将阻止客户端的请求

new*_*ike 6 ruby-on-rails ruby-on-rails-4

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

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

Rails.cache.fetch(cache_key, expires_in: 1.minute) do
    `fetch_data_from_mongoDB_with_complex_query`
end
Run Code Online (Sandbox Code Playgroud)

不知何故,当新请求进入时,会发生过期,并且请求将被阻止.我的问题是,我怎样才能避免这种情况?基本上,我希望在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
Run Code Online (Sandbox Code Playgroud)

更新

我怎样才能获得命令中的所有缓存键?

因为缓存的查询可以通过的组合物中产生start_date,end_date,depature_at,arrive_at.

无法手动使所有缓存的密钥无效.

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

Mus*_*hir 4

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

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

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

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