Rails를 사용하여 지속적으로 요약 데이터를 재 계산하지 않으려면 어떻게해야합니까?
-
28-10-2019 - |
문제
Stack Overflow 프로필 페이지 (예 : 총 방문수, 배지 수)와 다르지 않은 사용자 통계가있는 사이드 바가있는 사용자 프로필 페이지가 있습니다.
문제는 현재 데이터베이스를 검색하고 모든 단일 요청에 대해 이러한 통계를 계산하고 있다는 것입니다.이를 줄이기 위해 조각 캐싱을 구현할 수 있지만 이러한 유형을 처리하는 더 좋은 방법이 있습니까?
데이터베이스에 집계 된 요약 데이터를 저장하면 문제가 발생할 수있는 것 같습니다 (예 : 불일치).
해결책
다음을 사용하여이 정보를 다시 계산하는 대신 데이터베이스에 저장할 수 있습니다.
- 카운터 캐싱
- 맞춤 콜백
카운터 캐싱
예를 들어 배지 수를 측정하는 경우
User
라는badges_count
에 데이터베이스 필드를 만든 다음 Badge 모델에서belongs_to :user, :counter_cache => true
를 가질 수 있습니다. 이제 배지 수가 변경 될 때마다@user.badges_count
에서 새로운 계산없이 카운트에 액세스 할 수 있습니다.기본 구현 : http://asciicasts.com/episodes/23-counter-cache-column
맞춤 콜백
단순한 수보다 더 복잡한 행동을 측정하는 필드가 있다고 가정 해 보겠습니다. 이 경우
before_save
,after_save
,before_create
등을 사용하여 특정 작업이 발생할 때마다 필드를 업데이트하는 콜백을 구현하세요.불일치에 대한 우려
데이터베이스에 데이터를 저장하는 것은 잘못한 경우에만 일관성이 없습니다. 통계를 업데이트 할 수있는 경로는 한정되어 있으며 사용중인 필드를 업데이트 할 때 모든 경로가 포함되는지 확인해야합니다. Rails는 counter_caching을 사용하여이 작업을 수행하며, 사용자 정의 콜백을 사용하거나 비정상적인 상황이있는 경우 직접 수행해야합니다.
다른 팁
이 질문과 같이 숨겨진 div를 사용할 수 있습니다 ( 숨겨진 div를 사용하여 데이터 캐싱).캐시하려는 데이터의 양에 따라 이것이 좋은 해결책이 될 수 있습니다.