Rails 3.1 和 Http 页面缓存

7

鉴于Heroku Cedar没有由Varnish提供的http缓存,我想使用Rack::Cache。 我被告知rails 3.1.1默认情况下已经启用了Rack::Cache,我只需要确保在配置中存在:

config.action_controller.perform_caching = true

我需要选择一个缓存存储,这个实验我使用的是:

config.cache_store = :memory_store

在我想要缓存的页面的操作中,我添加了以下行:
response.header['Cache-Control'] = 'public, max-age=300'
response.header['Expires'] = CGI.rfc1123_date(Time.now + 300)

这段代码在使用Varnish时可以正常工作,第一次请求将返回200,之后的请求(5分钟内)将返回304

但是在Rails 3.1和Heroku Cedar Stack上不会发生这种情况。虽然响应中包含这些头部信息,但随后的请求返回200而不是304。

我做错了什么?谢谢。

1个回答

11

如您所述,Cedar堆栈不使用Varnish。这意味着Web请求将始终命中Ruby服务器。

考虑到这一点,Rack::Cache将遵循您的标头并提供缓存内容。

然而,由于请求实际上超越了http层进入rails应用程序,因此响应将始终为200,因为缓存不再发生在http层。

要确认这是正确的,请将以下内容插入其中一个已缓存的操作中:

<%= Time.now.to_i %>

然后,重新加载页面几次,您将注意到时间戳不会改变。


你是正确的!!!有没有一种 slightly higher level 的缓存方式?这样做值得吗?(例如,在 Rails 应用程序之前在 config.ru 中设置 rack::cache 会怎么样?) - soulnafein
不是真的...Rack::Cache 是你最好的选择。只需将其放在环境中尽可能高的位置,它应该能够为你提供所需的性能,因为它避免了整个 Rails http 栈。 - leonardoborges
哦,如果这个答案对你有帮助的话,我会很感激你能给它点个赞 :) - leonardoborges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接