6

RDC에서 인형 캐싱에 대해 잘 알고있는 이유는 RDC (러시아 인형 캐싱)를 수행 할 때 열의있는로드 관련 개체 또는 개체 목록에 해로울 것입니다. 데이터베이스의 최상위 오브젝트를 찾고 캐시 된 렌더링 된 템플리트를 검색하여 제공하십시오. 캐시가 부실하지 않으면 쓸모없는로드 관련 객체 목록을 열렬하게로드해야합니다.레일 러시아어 인형 캐싱 및 N + 1

내 이해가 정확합니까? 그렇다면 첫 번째 호출에서 N + 1 쿼리의 비용을 지불하지 않기 위해 (캐시가 따뜻하지 않은 경우) 첫 번째 호출에서 관련된 모든 객체를로드하려고 열심히 노력해야합니다.

답변

4

맞음 - 연관성이 많은 컬렉션 또는 복잡한 개체를로드 할 때 빠르고 간단한 호출을 수행하면 모든 개체와 연결을 열렬하게로드하는 비용이 많이 드는 호출을 피할 수 있습니다.

rails guide for caching에는 좋은 예가 있지만 조금씩 나뉩니다. 모음 (레일에서 즉 인덱스 동작을) 캐시의 일반적인 사용 사례를 보면 :

<% cache("products/all-#{Product.maximum(:updated_at).try(:to_i)}") do %> 
    All available products: 
    <% Product.all.each do |p| %> 
    <% cache(p) do %> 
     <%= link_to p.name, product_url(p) %> 
    <% end %> 
    <% end %> 
<% end %> 

이 (응축) 예 1 간단한 DB 호출 Product.maximum(:updated_at)이 훨씬 더 비싼 전화 Product.all을 수행하지 않도록한다.

콜드 캐시 (두 번째 질문)의 경우 관련 객체를 열심히로드하여 N + 1을 피하는 것이 중요합니다. 그러나 콜렉션에 대한 첫 번째 캐시 읽기가 누락되었으므로이 비싼 호출을 수행해야한다는 것을 알고 있습니다. Rails에서는 대개 includes을 사용하여이 작업을 수행합니다. Product 많은 Order의, 무언가 등에 속하는 경우 우리가 아직 부분적으로 따뜻한 캐시의 경우에는, 그러나, 수집 및 각 구성원에 대한 읽기 캐시를 수행 차가운 캐시 경우

<% cache("products/all-#{Product.maximum(:updated_at).try(:to_i)}") do %> 
    All available products: 
    <% Product.includes(:orders).all.each do |p| %> 
    <% cache(p) do %> 
     <%= link_to p.name, product_url(p) %> 
     Bought at: 
     <ul> 
     <% p.orders.each do |o| %> 
      <li><%= o.created_at.to_s %></li> 
     <% end %> 
     </ul> 
    <% end %> 
    <% end %> 
<% end %> 

, 우리는 렌더링을 건너 뜁니다 회원 일부분. 이 전략은 연결된 개체가 업데이트 될 때 에 올바르게 연결되는 Product의 연결에 의존합니다.

업데이트 : This blog post은 부분적으로 캐시 된 모음에 대한 건물 응답을 최적화하기위한보다 복잡한 패턴을 설명합니다. 전체 모음을 다시 작성하는 대신 사용 가능한 모든 캐시 된 값을 대량으로 가져온 다음 나머지 값에 대한 대량 쿼리를 수행하고 캐시를 업데이트합니다. 이는 여러 가지 방법으로 도움이됩니다. 대량 캐시 읽기는 N + 1 캐시 읽기보다 빠르며 캐시를 작성하는 DB에 대한 대량 쿼리도 더 작습니다.