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

任何人都知道为什么缓存说它丢失了?

4

1 回答 1

4

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

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

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

因此,总而言之,您有两个相互不知道的缓存方案,这就是为什么您会从其中一个中错过,而从另一个中获得成功的原因。

于 2012-02-13T08:40:36.833 回答