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

时间:2012-02-13 07:16:32

标签: ruby-on-rails caching page-caching

在开发模式下使用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。
  3. 这是第一次请求时日志输出的内容,然后是五次重新加载:

    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
    

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

1 个答案:

答案 0 :(得分:4)

缓存可以通过多种方式发生(是的,存在一些冗余)。

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

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

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