Rails中的缓存机制

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过期。

你可能感兴趣的:(rails,缓存机制,Ruby,on,rails,ruby)