Rails 3种缓存用法和实例

本文概述

缓存可用于任何Web技术。通过存储先前的结果以供后续请求来提高性能。默认情况下, 在Rails中禁用cahcing。

Rails缓存可用于三个粒度级别:

  • 行动
  • 分段

页面缓存

Rails页面缓存是一种将整个操作输出存储为HTML文件的技术。因此, Web服务器可以提供输出, 而无需通过Rails再次调用操作。结果, 它通过动态生成内容将性能提高了100倍。但是, 此技术仅对无法区分应用程序用户的无状态页面有用。

通过使用caches_ page方法调用, 可以为控制器类中的任何方法打开页面缓存。传递了需要作为cache_page的参数进行缓存的操作。无需包括你所有控制器的动作。

例:

步骤1创建一个应用程序MyCache -T

rails new MyCache -T

步骤2通过运行以下命令打开缓存。此命令在tmp目录中创建一个空的caching-dev.txt文件。

rake dev:cache

步骤3转到config / environments / development.rb文件并编写以下代码:

if Rails.root.join('tmp/caching-dev.txt').exist?
  config.action_controller.perform_caching = true
  config.action_mailer.perform_caching = false
  config.cache_store = :memory_store
  config.public_file_server.headers = {
    'Cache-Control' => 'public, max-age=172800'
  }
else
  config.action_controller.perform_caching = false
  config.action_mailer.perform_caching = false
  config.cache_store = :null_store
end

步骤4转到Gemfile, 添加以下行。

gem 'actionpack-page_caching'

步骤5运行捆绑安装。

bundle install

步骤6在config / application.rb文件中编写以下代码。它将指定要保存缓存页面的位置。

config.action_controller.page_cache_directory = "#{Rails.root.to_s}/public/deploy"

步骤7我们将在这里介绍一个控制器。运行以下命令:

rails generate controller page

步骤8在app / page_controller.rb文件中, 编写以下代码。

class PageController < ApplicationController 
  def index 
  end 
end

步骤9我们将在这里介绍一个控制器。运行以下命令:

root 'page#index'

步骤10转到views / page / index.html.erb文件。

<h1>Welcome to our Cached example tutorial.</h1>

步骤11通过caches_page方法启用页面缓存。转到控制器文件并编写以下代码:

class PageController < ApplicationController 
  caches_page index 
  end

步骤12启动服务器。

rails s

步骤13在本地主机上运行它。

localhost:3000
Ruby on Rails缓存1

动作缓存

Rails动作缓存可保存动作响应(如页面缓存)的整个输出。操作缓存只有一个区别, 操作调用仍被路由到控制器, 因此仍可以应用任何过滤器。通过使用caches_ action方法调用, 可以为控制器类中的任何方法打开操作缓存。

例:

我们将继续上面的示例。

步骤14转到Gemfile, 编写以下代码。

gem 'actionpack-action_caching'

步骤15运行捆绑安装。

bundle install

步骤16要使用动作缓存, 让我们创建一个新的受限页面。在控制器文件中编写以下代码。

class PageController < ApplicationController 
before_action :authenticate!, only: [:restricted]  

  caches_page :index 
  caches_action :restricted 

  def index 
  end 

  def restricted 
  end 

  private 

  def authenticate! 
    params[:admin] == 'true' 
  end 
end

步骤17创建app / views / page / restricted.html.erb文件。

<h1>This is restricted page created for action caching.</h1>

步骤18转到config / routes.rb文件并编写以下代码。

get '/restricted', to: 'pages#restricted'

步骤19启动服务器。

rails s

步骤20在本地主机上运行它。

Localhost:3000/restricted
Ruby On Rails缓存2

片段缓存

Rails片段缓存用于在模板中缓存块, 而不是缓存动作方法的整个输出。当你需要频繁更改操作的某些部分而无法缓存, 而其他部分由于它们保持静态而需要缓存时, 这很有用。

它是在视图模板而不是控制器类中完成的。片段缓存由cache_do块指定。 cache_do语句中包含的块内的行将被缓存。

例:

我们将继续上面的示例。

步骤21创建一个名为frag的新模型。

rails g model Frag title:string

步骤22运行migrate命令。

rake db:migrate

步骤23转到app / controllers / frags_controller.rb文件。

class FragsController < ApplicationController 
  def index 
    @frags = Frag.all 
  end 
end

步骤24转到config / routes.rb文件。添加以下行。

resources :frags, only: [:index]

步骤25转到app / views / frags / index.html.erb文件。

<h1>Fragments</h1> 

<% @frags.each do |frag| %> 
  <%= frag.title %> 
<% end %>

步骤26转到db / seeds.rb文件以填充片段表。

20.times {|i| Frag.create!({title: "Frag #{i + 1}"})}

步骤27运行rake命令。

rake db:seed

步骤28如果我们要缓存页面上列出的每个片段, 将使用缓存方法来完成。

转到app / views / frags / index.html.erb文件。

<% @frags.each do |frag| %> 
  <% cache frag do %> 
    <%= frag.title %> 
    
  <% end %> 
<% end %>

步骤29当对象传递给缓存方法时, 它会自动获取其ID并生成适当的缓存键。如果片段已更新, 则缓存将自动过期。

在app / views / frags / index.html.erb文件中将渲染方法与缓存选项一起使用。

<%= render @frags, cached: true %>

下载

下载此示例

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?