Rails.cache.fetch 的 :race_condition_ttl 选项似乎非常接近我想要的:http ://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch
但它似乎仍然阻止遇到过期值的第一个请求(只有在此之后的后续请求才会获取旧值并在更新缓存时快速返回)。
我想我很惊讶它没有以同样的方式服务第一个过期的请求,并且想知道是否有一个共同的模式或者它是否必须是自定义的。
Rails.cache.fetch 的 :race_condition_ttl 选项似乎非常接近我想要的:http ://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch
但它似乎仍然阻止遇到过期值的第一个请求(只有在此之后的后续请求才会获取旧值并在更新缓存时快速返回)。
我想我很惊讶它没有以同样的方式服务第一个过期的请求,并且想知道是否有一个共同的模式或者它是否必须是自定义的。
我现在用猴子修补了这样的东西:https ://gist.github.com/4062316
不确定它有多安全,但似乎正在工作。不过,在标准的 Rails.cache 中看到这样的东西会很棒。
我使用了另一种方法来解决这个问题:不要设置 expires_in,只有在管理员请求时才强制缓存未命中。
我在两个环境中有 Rails 应用程序:管理员和生产。生产永不过期缓存。管理员总是在页面上强制缓存未命中。
一旦你建立了所有的缓存。它永不过期。除非您可以从管理员那里执行此操作。由于管理员可以保证第一次访问这些网页,使用 :race_condition_ttl,这种方法效果很好。