Rails中的缓存机制
Rails支持三种缓存机制:
1.页面缓存
2.动作缓存
3.片段缓存
要使用缓存机制首先要在config/environment.rb
中加入:
config.action_controller.perform_caching = true
注意:在生产环境中,缓存配置默认是true。
注意:Rails4中已经将页面缓存和动作缓存,剥离出来了,独立成了两个Gems,要想使用这两种缓存,需要安装actionpack-page_caching,actionpack-action_caching gem。
页面缓存
页面缓存允许网页服务器(Apache或Nginx等)直接处理请求,不经过rails处理,这么做显然提升了网页加载的速度,但并不适用于所有的情况,比如需要身份验证的页面。服务器直接从文件系统上拿取文件,所以对于页面缓存来说,缓存过期是一个棘手的问题。
class PostController < ApplicationController
caches_page :index
def index
@posts = Post.all
end
end
动作缓存
动作缓存相对于页面缓存来说,基本上都差不多,但是要是动作上有前置过滤器,就只能使用动作缓存,动作的缓存的请求是经过rails处理的,所以在进行缓存之前,会首先经过前置过滤器,然后再从缓存中取出结果,返回给客户端。
class PostController < ApplicationController
before_filter :auth_user, except: [index]
caches_page :index
caches_action :aaa,:bbb
def index
@posts = Post.all
end
def aaa
balabala
end
def bbb
bala...
private
def auth_user
do something
end
end
片段缓存
现代的网页基本上是有动态的内容生成网页,你很难用页面缓存和动作缓存去缓存大多数的页面,所以片段缓存正好适用于此,对于不同的内容,使用不同的缓存方式和过期时间。
片段缓存把视图逻辑一部分打包在cache块中,后续的请求都会从缓存块中取出这部分内容。
<% cache ('all_available_products') do %>
All products:
<% @products.each do |p| %>
<%= link_to p.name, product_url(p) %>
<%= p.price %>
<% end %>
<% end %>
这样’all_available_products’作为cache key被缓存起来,如果有产品更新了,或者删除了,只要在对应的action里调用expire_fragment('all_available_products') 就会使这个key过期。