맞음 - 연관성이 많은 컬렉션 또는 복잡한 개체를로드 할 때 빠르고 간단한 호출을 수행하면 모든 개체와 연결을 열렬하게로드하는 비용이 많이 드는 호출을 피할 수 있습니다.
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에 대한 대량 쿼리도 더 작습니다.