수색…


러시아 인형 캐싱

캐시 된 조각을 다른 캐시 된 조각 안에 중첩 할 수 있습니다. 이것을 Russian doll caching 이라고합니다.

Russian doll caching 의 장점은 단일 제품이 업데이트 된 경우 외부 조각을 재생성 할 때 다른 모든 내부 조각을 다시 사용할 수 있다는 것입니다.

이전 섹션에서 설명한 것처럼 캐시 된 파일이 직접적으로 의존하는 레코드의 updated_at 값이 변경되면 캐시 된 파일이 만료됩니다. 그러나 조각이 중첩 된 캐시는 만료되지 않습니다.

예를 들어 다음보기를 생각해보십시오.

<% cache product do %>
  <%= render product.games %>
<% end %>

다음으로이보기를 렌더링합니다.

<% cache game do %>
  <%= render game %>
<% end %>

게임의 속성이 변경되면 updated_at 값이 현재 시간으로 설정되어 캐시가 만료됩니다.

그러나 제품 오브젝트에 대해 updated_at 은 변경되지 않으므로 해당 캐시는 만료되지 않으며 앱은 부실 데이터를 제공합니다. 이를 해결하기 위해 우리는 터치 방식과 함께 모델을 묶습니다.

class Product < ApplicationRecord
  has_many :games
end

class Game < ApplicationRecord
  belongs_to :product, touch: true
end

SQL 캐싱

쿼리 캐싱은 각 쿼리에서 반환 된 결과 집합을 캐시하는 Rails 기능입니다. Rails 가 해당 요청에 대해 동일한 쿼리를 다시 발견하면 데이터베이스에 대해 쿼리를 다시 실행하는 것과는 대조적으로 캐시 된 결과 집합을 사용합니다.

예 :

class ProductsController < ApplicationController

  def index
    # Run a find query
    @products = Product.all

    ...

    # Run the same query again
    @products = Product.all
  end

end

같은 쿼리가 데이터베이스에 대해 두 번 실행되면 데이터베이스에 실제로 도달하지 않습니다. 결과가 쿼리에서 반환되면 쿼리 캐시 (메모리)에 저장되고 두 번째로 메모리에서 꺼내집니다.

그러나 쿼리 캐시는 작업 시작시 만들어지며 해당 작업이 끝날 때 소멸되므로 작업 기간 동안 만 유지됩니다. 보다 지속적인 방식으로 쿼리 결과를 저장하려면 낮은 수준의 캐싱으로 수행 할 수 있습니다.

단편 캐싱

ActiveSupport에서 제공하는 Rails.cache 사용하여 일련의 모든 루비 객체를 요청간에 캐시 할 수 있습니다.

주어진 키의 캐시에서 값을 가져 오려면 cache.read 사용 cache.read .

Rails.cache.read('city')
# => nil

cache.write 를 사용하여 캐시에 값을 쓰십시오.

Rails.cache.write('city', 'Duckburgh')
Rails.cache.read('city')
# => 'Duckburgh'

또는 cache.fetch 를 사용하여 캐시에서 값을 읽고 선택적으로 값이없는 경우 기본값을 쓸 수도 있습니다.

Rails.cache.fetch('user') do
  User.where(:is_awesome => true)
end

전달 된 블록의 반환 값은 주어진 키 아래의 캐시에 할당 된 다음 반환됩니다.

캐시 만료를 지정할 수도 있습니다.

Rails.cache.fetch('user', :expires_in => 30.minutes) do
  User.where(:is_awesome => true)
end

페이지 캐싱

ActionPack page_caching gem 을 사용하여 개별 페이지를 캐시 할 수 있습니다. 이것은 하나의 동적 요청의 결과를 정적 HTML 파일로 저장합니다. 정적 HTML 파일은 후속 요청에서 동적 요청 대신 사용됩니다. README에는 전체 설치 지침이 들어 있습니다. 설정이 끝나면 컨트롤러에서 caches_page 클래스 메소드를 사용하여 액션 결과를 캐시합니다.

class UsersController < ActionController::Base
  caches_page :index
end

expire_page 를 사용하여 저장된 HTML 파일을 삭제하여 캐시가 만료되도록하십시오.

class UsersController < ActionController::Base
  caches_page :index

  def index
    @users = User.all
  end

  def create
    expire_page :action => :index
  end
end

의 구문 expire_page 그 모방 url_for 친구.

HTTP 캐싱

Rails> = 3은 HTTP 캐싱 기능을 기본적으로 제공합니다. 이것은 Cache-ControlETag 헤더를 사용하여 클라이언트 나 중개자 (예 : CDN)가 페이지를 캐시 할 수있는 기간을 제어합니다.

컨트롤러 동작에서 expires_in 을 사용하여 해당 동작에 대한 캐싱 길이를 설정합니다.

def show
  @user = User.find params[:id]
  expires_in 30.minutes, :public => true
end

expires_now 를 사용하여 방문 클라이언트 또는 중개자의 캐시 된 리소스가 즉시 만료되도록합니다.

def show
  @users = User.find params[:id]
  expires_now if params[:id] == 1
end

액션 캐싱

페이지 캐싱과 마찬가지로, 액션 캐싱은 전체 페이지를 캐싱합니다. 차이점은 캐시가 제공되기 전에 필터가 실행되기 전에 요청이 레일 스택에 도달한다는 것입니다. Rails에서 actionpack-action_caching 젬으로 추출되었습니다.

일반적인 예는 인증이 필요한 작업의 캐싱입니다.

class SecretIngredientsController < ApplicationController
  before_action :authenticate_user!, only: :index, :show
  caches_action :index
  
  def index
    @secret_ingredients = Recipe.find(params[:recipe_id]).secret_ingredients
  end
end

옵션에는 :expires_in , custom :cache_path (다르게 캐시되어야하는 여러 경로가있는 작업의 :if ) 및 :if / :unless 액션이 캐시되어야하는 시점을 제어 :unless :if 가 있습니다.

class RecipesController < ApplicationController
  before_action :authenticate_user!, except: :show
  caches_page :show
  caches_action :archive, expires_in: 1.day
  caches_action :index, unless: { request.format.json? }
end

레이아웃에 동적 내용이있는 경우 layout: false 를 전달하여 액션 내용 만 캐시합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow