深入理解Ruby on Rails中的缓存机制

2019-09-25 09:43:38于海丽

动作缓存

至此,您已经了解了页面缓存的主要的优势及主要的缺点:对于多数页面检索而言,根本无需考虑使用 Rails。页面缓存的优势是速度快。缺点是缺少灵活性。如果想要基于应用程序内的条件 — 例如,身份认证 — 来缓存整个页面,那么可以使用动作缓存。

动作缓存与页面缓存的工作方式大体相同,但在流程上稍有差别。Rails 在呈现动作前会实际调用控制器。如果由该动作呈现的页面已经存在于缓存内,那么 Rails 就会在缓存内呈现页面而不是重新加以呈现。由于现在使用了 Rails,因此动作缓存的速度要比页面缓存慢一些,但其优点还是很明显的。几乎所有的 Rails 认证模式都会在控制器上使用 before 过滤器。动作缓存让您能够利用认证及控制器上的任何过滤器。

从语句构成的角度来看,动作缓存与页面缓存也应该十分类似,只有指令不太一样。清单 6 显示了如何使用 caches_action 指令。
清单 6. 启用动作缓存

  class AboutController < ApplicationController
   caches_action :secret_page, :secret_list 
  end

缓存到期失效以及清理器的工作方式也应该相同。我们不使用动作缓存的原因与我们不使用页面缓存的原因是一样的,但分段缓存对我们来说更重要一些。
缓存页面分段

借助部分缓存,可以缓存页面的一部分,所缓存的内容很多时候都是布局之类的。要使用分段缓存,开发人员需要先确定分段,方法是通过在 Web 页面上直接放上 rhtml 指令来包围一块内容,如清单 7 所示。在 ChangingThePresent.org 上,我们使用分段缓存来缓存首页和其他的几页。所有的这些页均使用了数据库密集访问而且大都是我们最受欢迎的页面。
清单 7. 确定缓存分段

<% cache 'gifts_index' do %>
  <h3>
   Here, you can make the world a better place with a single gift. Donation gifts 
   are also a wonderful way to honor friends and family. Just imagine what we
   can achieve together.
  </h3>
  <h2 class="lightBlue"><%= @event_title %></h2>
  <div id="homefeatureitems">
    <% for gift in @event_gifts %>
     <%= render :partial => 'gifts/listable', :locals => { :gift => gift } %>
    <% end %>
  </div>
  ...
<% end %>

在清单 7 中,cache 帮助程序标识所要缓存的分区。第一个参数是标识此缓存分区的惟一名称。第二个参数包含代码块 — 即第一个 do 和最后一个 end 之间的代码 — 此代码块准确地确定了要缓存的 RHTML 分区。

我们的网站只有一个主页,所以命名这个页面非常容易。在其他地方,我们使用一种特定的方法来决定此网页的 URL 以便惟一标识缓存分段。例如,当我们为特定的内容(比如世界和平或减少贫困)而进行代码缓存时,我们需要使用清单 8 中的代码。代码会为之寻找永久 url,也称为 permalink。