在开发模式下使用Rails 3.2,我试图测试一些简单的页面缓存。
pages_controller.rb
class PagesController < ActionController::Base
caches_page :index, :show
def index
@pages = Page.all
end
def show
@page = Page.find(params[:id])
end
end
development.rb
config.action_controller.perform_caching = true
application.rb中
config.action_controller.page_cache_directory = File.join(Rails.root, 'public')
当我测试此设置时,它似乎正常处理这些操作,并且页面缓存按预期编写。但是,随后的请求会报告以下两件令我困惑的事情:
这是第一次请求时日志输出的内容,然后是五次重新加载:
Started GET "/pages" for 127.0.0.1 at 2012-02-12 21:01:24 -1000
Processing by PagesController#index as HTML
Page Load (0.2ms) SELECT `pages`.* FROM `pages`
Rendered pages/index.html.erb (0.8ms)
Write page /Users/ckihe/Sites/experiment/public/pages.html (0.3ms)
Completed 200 OK in 3ms (Views: 1.9ms | ActiveRecord: 0.2ms)
cache: [GET /pages] miss
cache: [GET /pages] miss
cache: [GET /pages] miss
cache: [GET /pages] miss
cache: [GET /pages] miss
任何人都有任何想法为什么缓存说它丢失了?
答案 0 :(得分:4)
缓存可以通过多种方式发生(是的,存在一些冗余)。
从(我认为)rails 3.1开始,为您设置Rack::Cache
。这是一个http级缓存,可以了解所有有关到期时间,etags等的信息,并且可以将数据存储在各种缓存存储中。这是报告缓存未命中的原因,可能是因为您没有发出允许其缓存页面的缓存控制标头(请参阅expires_in
或fresh_when
帮助程序)。
您配置的排序的页面缓存方式较旧,完全不同。它将呈现的HTML转储到您选择的目录中,然后rails将其作为静态资源提供(在生产中,您可以将其配置为直接从Web服务器提供,而无需接触ruby级代码)。这种缓存不太智能,对http缓存控制头等一无所知(但另一方面速度非常快)。
总而言之,你有两个不知道对方的缓存方案,这就是为什么你从其中一个中得到一个错误而另一个得到一个命中的原因。