【问题标题】:How to expire Rails conditional GET caching?如何使 Rails 条件 GET 缓存过期?
【发布时间】:2014-03-20 09:03:44
【问题描述】:

我正在使用 stale? 方法在我的 JSON API 中进行条件 GET 缓存。

我用

@post = Post.find(params[:post_id])
if stale? @post
  #continue
end

AFAIK 这使用帖子的 updated_at 来制作缓存键。有什么方法可以在不执行 post.touch 的情况下使该项目的缓存条目过期?我正在使用 Heroku。

【问题讨论】:

  • 您是否在使用某种 http 缓存代理(如 rack-cache)并设置 s-maxage 以使请求不会命中堆栈?
  • @JesseGoodfellow 不,我不这么认为。该请求肯定会命中堆栈,因为我的 Post Controller 中使用了 stale? 方法
  • 您试图使条目过期的缓存是什么?浏览器缓存?你是说即使记录没有改变你也想用 200 回应?还是记录被修改但仍以 304 响应?如果陈旧?方法使用 etag,您可以通过修改 ENV['RAILS_CACHE_ID'] 变量来使应用中的所有 etag 失效
  • @JesseGoodfellow 是的,基本上我对 api 响应的外观进行了更改。模型/记录本身没有改变。所以我希望能够停止发送 304 NOT MODIFIED 并发送 200。

标签: ruby-on-rails heroku http-caching


【解决方案1】:

在 config/initializers 中创建一个名为 bust_cache.rb 的文件,其内容如下:

ENV["RAILS_CACHE_ID"] = 'version1'

如果将来您希望再次破坏缓存,请将值更改为“version2”等。如果您希望在每次部署使用时破坏缓存:

ENV["RAILS_CACHE_ID"] = Time.now.to_s

***请注意,最后一种策略不适用于 Heroku 上的多个 dyno 或其他类似情况

感谢Nathan Kontny

【讨论】:

  • 谢谢,还没有测试过,但似乎可以。
猜你喜欢
  • 1970-01-01
  • 2012-02-09
  • 2016-02-28
  • 1970-01-01
  • 2015-03-11
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多