使用Rails 3.2缓存未命中和开发中的页面缓存 – 还有其他人吗?

在开发模式下使用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') 

当我测试这个设置时,似乎正常处理这些操作,并且页面缓存按预期编写。 但是,后续请求报告了以下两件令我困惑的事情:

  1. 它似乎错过了缓存,但……
  2. 之后的请求似乎没有加载控制器,运行任何查询等,导致我相信它从缓存加载DID。

这是第一次请求时日志输出的内容,然后是五次重新加载:

 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 

任何人都有任何想法为什么缓存说它丢失了?

有多种方法可以实现缓存(是的,有一些冗余)。

从(我认为)rails 3.1开始,为您设置Rack::Cache 。 这是一个http级缓存,可以了解所有有关到期时间,etags等,并可以将数据存储在各种缓存存储中。 这是报告缓存未命中的原因,可能是因为您没有发出允许其缓存页面的缓存控制标头(请参阅expires_infresh_when帮助程序)。

您配置的排序的页面缓存方式较旧,完全不同。 它将呈现的HTML转储到您选择的目录中,然后rails将其作为静态资源提供(在生产中,您可以将其配置为直接从Web服务器提供,而无需接触ruby级代码)。 这种缓存不太智能,对http缓存控制头等一无所知(但另一方面非常快)。

总而言之,你有两个不知道彼此的缓存方案,这就是为什么你从其中一个中得到一个错误而另一个得到一个命中的原因。