Ruby on Rails
캐싱
수색…
러시아 인형 캐싱
캐시 된 조각을 다른 캐시 된 조각 안에 중첩 할 수 있습니다. 이것을 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-Control
및 ETag
헤더를 사용하여 클라이언트 나 중개자 (예 : 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
를 전달하여 액션 내용 만 캐시합니다.