2011-11-18 48 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