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任务中刷新
使用起来expiration很棘手,因为一旦缓存的对象过期,您将无法获取过期的值。
最佳实践是将缓存刷新过程与最终用户流量分离。您需要一个 rake 任务来填充/刷新您的缓存并将该任务作为 cron 运行。如果由于某种原因作业没有运行,缓存就会过期,您的用户将需要额外的时间来获取数据。
但是,如果您的数据集太大而无法一次刷新/加载所有数据,则必须使用不同的缓存过期策略(您可以在每次缓存命中后更新过期时间)。
或者,您可以禁用缓存过期并使用不同的指示器(例如时间)来确定缓存中的对象是最新的还是过时的。如果它已过时,您可以使用异步ActiveJob工作线程对作业进行排队以更新缓存。过时的数据将返回给用户,并且缓存将在后台更新。
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |