2011-11-18 24 views
7

Cho rằng Heroku Cedar không có bộ nhớ đệm http do Varnish cung cấp, tôi muốn sử dụng Rack::Cache. tôi đã được cho biết rằng đường ray 3.1.1 có Rack::Cache hoạt động theo mặc định, tôi chỉ cần phải chắc chắn phải có trong cấu hình:Rails 3.1 và Http Page Caching

config.action_controller.perform_caching = true 

và tôi cần phải chọn một cửa hàng bộ nhớ cache, cho thí nghiệm này tôi sử dụng:

config.cache_store = :memory_store 

trong hành động of the page tôi muốn bộ nhớ cache tôi đã thêm các dòng sau:

response.header['Cache-Control'] = 'public, max-age=300' 
response.header['Expires'] = CGI.rfc1123_date(Time.now + 300) 

mã này đã từng làm việc tốt với Varni sh, yêu cầu đầu tiên sẽ trả về 200 và tiếp theo (trong 5 phút) sẽ trả lại một 304.

Điều này không xảy ra với Rails 3.1 và Heroku Cedar Stack. Tôi nhận được các tiêu đề đó trong phản hồi nhưng các yêu cầu tiếp theo trả về 200 thay vì 304.

Tôi đang làm gì sai? Cảm ơn bạn.

Trả lời

11

Như bạn đã lưu ý, ngăn xếp Cedar không sử dụng Varnish. Điều đó có nghĩa là một yêu cầu web sẽ luôn luôn nhấn máy chủ ruby.

Với ý nghĩ đó, Rack :: Cache sẽ tôn trọng tiêu đề của bạn và phục vụ nội dung được lưu trong bộ nhớ cache.

Tuy nhiên, vì yêu cầu thực sự đi qua lớp http vào ứng dụng đường ray, phản hồi sẽ luôn là 200 vì bộ nhớ cache không xảy ra ở lớp http nữa.

Để khẳng định điều này là đúng, chèn này tại một trong những hành động lưu trữ của bạn:

<%= Time.now.to_i %>

Sau đó, tải lại trang nhiều lần và bạn sẽ nhận thấy các dấu thời gian sẽ không thay đổi.

+0

Bạn nói đúng !!!! Có cách nào để cache ở mức cao hơn một chút không? Nó có đáng không? (ví dụ: nếu tôi thiết lập giá đỡ :: cache trong config.ru trước ứng dụng đường ray?) – soulnafein

+0

không thực sự ... Rack :: Cache là đặt cược tốt nhất của bạn. Chỉ cần đặt là cao như bạn có thể trong môi trường của bạn và nó sẽ cung cấp cho bạn hiệu suất bạn cần cho nó tránh toàn bộ ngăn xếp http Rails. – leonardoborges

+0

Oh và tôi rất cảm kích nếu bạn có thể bỏ phiếu cho câu trả lời gốc nếu nó giúp bạn :) – leonardoborges