第十六章补遗(四)
第十六章补遗(四)
第二部分 Caching --- 缓存
缓存是提高应用程序速度的廉价方式,是通过保持计算的,提交的,数据库的结果给随后的请求来做到的。动作控制器提供了三种级别粒度的方式:页,动作,段。
注意:设置 Base.perform_caching = false 可关闭缓存和 sweeper 。
1、Module ActionController::Caching::Actions
2、Module ActionController::Caching::Fragments
3、Module ActionController::Caching::Pages
4、Module ActionController::Caching::Sweeping
一、Pages --- 页缓存
页缓存是一种缓存的途径,它用来缓存一个HTML文件,此文件存储整个动作的输出,以后服务器可以不通过动作包来提供此HTML页的服务。 这要比对动态生成内容的处理快上约100倍。不幸地,这种速度的增长只对无状态页有效, 因为无状态态页它对所有访问者是一样的。内容管理系统 -- 包括 weblogs 和 wikis -- 有许多页很适用这种途径, 但基于统计的系统,人们登录,管理它们自己数据,通常很少有相似的。
可以通过 caches 类方法来指定哪个动作被缓存:
class WeblogController < ActionController::Base
caches_page :show, :new
end
这将生成缓存文件如 weblog/show/5 和 weblog/new ,它匹配用于触发动态生成的URL。这就是 web 服务能够在缓存页存在时挑选它,缓存页不存在时传递请求给动作包来生成它的原因。
失效缓存由删除缓存文件来处理,结果是一种懒惰的重新生成的途径,也就是在对它做出请求之前,缓存不会被重新存储。API 模仿 url_for 的操作来完成这些:
class WeblogController < ActionController::Base
def update
List.update(@params["list"]["id"], @params["list"])
expire_page :action => "show", :id => @params["list"]["id"]
redirect_to :action => "show", :id => @params["list"]["id"]
end
end
另外,你可以使用 Sweepers 来失效缓存,在一个缓存被假定失效时,Sweepers 决定模型内的修改动作。
A、Setting the cache directory (设置缓存目录)
缓存目录应该在 web 服务的文档根目录,使用 Base.page_cache_directory = "/document/root" 来设置。对于 Rails ,这个目录已经被设置为 RAILS_ROOT + "/pulbic" 。
B、Setting the cache extension (设置缓存的扩展名)
缺省地,缓存的扩展名是 .html ,这可以让 web 服务器轻易地挑选被缓存的文件。如果你想使用其它的扩展名,像 .php 或 .shtml ,只要设置Base.page_cache_extension 即可。
1、cache_page(content = nil, options = {}) 手工缓存由 options 做为 key 键决定的 content 内容。如果没有指定内容,并且没有指定选项的话,则 @response.body 的内容会被使用, 用于该动作的当前选项会被使用。例如:
cache_page "I'm the cached content", :controller => "lists", :action => "show"
2、expire_page(options = {}) 失效由 options 键缓存的页。例如:
expire_page :controller => "lists", :action => "show"
二、Actions --- 动作缓存
动作缓存与页缓存类似,事实上都是对应答的整个输出进行缓存,但不像页缓存,每个请求还将会通过动作包。这主要的好处是过滤器会在缓存被保存前得到运行,它允许对其它人是否被允许查看被缓存的内容做出鉴定和其它的约束。例如:
class ListsController < ApplicationController
before_filter :authenticate, :except => :public
caches_page :public
caches_action :show, :feed
end
在这个例子中,public 动作不要求鉴定,所以它可以使用快速的页缓存方法。但是 show 和 feed 动作两者需要 authenticate 过滤器在背后的保护,因此我们需要为它们实现动作缓存。
动作缓存内部使用了段缓存,并且完成一个 around 过滤器工作。段缓存根据当前的主机和路径两者来命名。所以对 david.somewhere.com/lists/show/1 页的访问将导致名为 "david.somewhere.com/lists/show/1" 的段被访问。这允许缓存器区别"david.somewhere.com/lists/" 与 "jamis.somewhere.com/lists/" 两者的区别,
1、expire_action(options = {})

浙公网安备 33010602011771号