2011-11-18 93 views
7

鉴于Heroku Cedar没有varnish提供的http缓存,我想使用Rack::Cache。 我已被告知,轨道3.1.1具有Rack::Cache活跃在默认情况下,我只需要确保在配置:Rails 3.1和Http页面缓存

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) 

使用此代码来很好地工作Varni sh,第一个请求将返回200,随后的(5分钟)将返回304

Rails 3.1和Heroku Cedar Stack不会发生这种情况。 我确实在响应中获得了这些标题,但随后的请求返回了200而不是304.

我在做什么错?谢谢。

回答

11

正如您所述,雪松烟囱不使用清漆。这意味着一个Web请求将永远打在Ruby服务器上。

考虑到这一点,Rack :: Cache将尊重您的标题并提供缓存的内容。

但是,由于请求实际上是通过http层进入rails应用程序,所以响应将始终为200,因为缓存不再发生在http层。

为了证实这是真的,在缓存的操作之一插入此:

<%= Time.now.to_i %>

然后,重新加载页面几次,你会发现时间戳不会改变。

+0

你是对的!有没有办法在稍高一点的地方缓存?这值得么? (例如,如果我在rails.ru之前在rails应用程序中设置rack :: cache,那该怎么办?) – soulnafein

+0

不是真的... Rack :: Cache是​​你最好的选择。在你的环境中,尽可能的高,因为它避免了整个Rails http堆栈,它应该给你所需要的性能。 – leonardoborges

+0

哦,我会很感激,如果你可以投票了原来的答案,如果它帮助你:) – leonardoborges