我们现在正在着手转向采用图形加速器 Panther Express 来缓存最经常被使用的图像以使其能够更快地被我们的客户访问到。要采取这种策略,我们将需要一个子域 images.changingThePresent.org。Panther Express 直接在图像的本地缓存中提供图像服务,然后再向我们发送请求。由于 Panther 服务并不知道我们何时会更改图像,所以我们使用 HTTP 报头来使其到期失效,如下所示:
HTTP 缓存失效报头
HTTP/1.1 200 OK Cache-Control: max-age=86400, must-revalidate Expires: Tues, 17 Apr 2007 11:43:51 GMT Last-Modified: Mon, 16 Apr 2007 11:43:51 GMT
注意这些不是 HTML 报头。它们与 Web 页面内容独立构建。Web 服务器将负责构建这些 HTTP 报头。像这样一篇有关 Rails 的文章系列若详细介绍 Web 服务器配置,未免有点偏题,所以我将直接切入可用 Rails 框架进行控制的缓存内容这一主题(有关 Web 服务器配置的更多内容,请参见 参考资料 中的相关链接)。
页面缓存
如果动态页面不经常更改,可以使用页面级的缓存。比如,Blog 和公告牌使用的就是这种缓存。通过页面缓存,Rails 就可以用来构建动态 HTML 页,并将此页存储在公共目录,这样,应用程序服务器就可以像服务其他静态页面一样来服务这个动态页。
如果页面已经被缓存,那么就不需要引入 Rails,页面缓存是 Rails 内速度最快的一种缓存。在最底层,页面缓存实际上在 Rails 中非常容易实现。页面和分段缓存二者均在控制器级别发生。您需要告知 Rails 如下内容:
想要缓存哪些页面? 当页面内容更改时,您如何能在缓存中让该页面到期失效?可以通过在控制器类中使用 caches_page 指令来启用页面缓存。例如,若要在 about_us_controller 缓存 privacy_policy 和 user_agreement 页面,可以输入如下代码:
清单 2. 启用页面缓存
class AboutController < ApplicationController caches_page :privacy_policy, :user_agreement end
让页面到期失效则可以通过 expire_page 指令来实现。若要在 Rails 调用 new_pages 动作时使上述页面到期失效,可以使用如下代码:
清单 3. 使页面失效
class AboutController < ApplicationController caches_page :privacy_policy, :user_agreement def new_pages expire_page :action => :privacy_policy expire_page :action => :user_agreement end end
另外,有几个小问题需要注意,比如 URL。URL 不能依赖于 URL 参数。例如,应该使用 gifts/water/1 而非 gifts/water?page=1。在 routes.rb 中使用这类 URL 将非常容易。比如,我们的页面中总是有一个选项卡参数用来显示哪个选项卡被当前选中。若要将此选项卡作为 URL 的一部分,我们会有如下的路由规则:










