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

开发.rb

config.action_controller.perform_caching = true

应用程序.rb

config.action_controller.page_cache_directory = File.join(Rails.root, 'public')

当我测试这个设置时,它似乎像正常情况一样处理这些操作,并且页面缓存按预期写入。然而,随后的请求报告了以下两件让我感到困惑的事情:

  1. 它似乎错过了缓存,但是
  2. 之后的请求似乎不会加载控制器、运行任何查询等,这让我相信它确实是从缓存加载的

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

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级别的缓存,它了解所有关于到期时间、etag等的信息,并可以将数据存储在各种缓存中。这就是报告缓存未命中的原因,可能是因为您没有发出允许它缓存页面的缓存控制标头(请参阅expires_infresh_when帮助程序)。

您配置的那种页面缓存要老得多,而且操作完全不同。它将渲染的HTML转储到您选择的目录中,然后rails将这些作为静态资产提供服务(在生产中,您可以将其配置为直接从web服务器提供服务,而无需接触ruby级别的代码)。这种缓存不那么智能,对http缓存控制头等等一无所知(但另一方面速度非常快)。

因此,总的来说,您有两个互不知情的缓存方案,这就是为什么您会从其中一个缓存方案中获得未命中,而从另一个缓存中获得命中。

最新更新