2016-08-04 2 views
0

Rails.cache으로 레코드를 캐시하는 것이 좋은가요?레일 캐시 기록

지난 15 개의 레코드를 캐시에 저장하고 싶습니다.

def last_fifteens 
    last(15).map(&:title) 
    end 

    def cached 
    Rails.cache.write('last_fifteens',last_fifteens,expires_in: 1.hour) 
    end 

    def self.fetch_last_fifteens 
    Rails.fetch('last_fifteens') 
    end 

Product.fetch_last_fifteens 

하거나 잘못된 접근 방식이다보기

보다 모델

예를 를 들어

?

답변

0

대부분의 경우 응용 프로그램에서 위와 같은 간단한 쿼리를 사용하면 코드베이스가 복잡해지는 것을 제외하고는 아무런 큰 영향을 미치지 않습니다 (응용 프로그램이 트위터 나 페이스 북과 비슷한 트래픽을 얻지 못하는 경우는 거의 없습니다. :)). 이러한 낮은 수준의 최적화는 응용 프로그램 성능을 모니터링하고 벤치마킹 한 후에 만 ​​수행해야합니다.

위의 샘플 코드를 살펴보면 코드가 향상 될 수 있습니다. 기본 범위는 모델 당신은 걱정할 필요가 없다

존재하지 않는 두 가지 조건

이 있습니다.

모델은 항상 기본 범위

그에게 쿼리가 형성되고 보는 좋은 방법이있다. 대부분의 시나리오에서 솔루션은 최적이 아닙니다. 예 : 다음, 즉

SELECT `locations`.* FROM `locations` ORDER BY locations.name asc 

, 우리는 데이터베이스에서 모든 위치를 가져 오는 것 : 여기

class Location < ActiveRecord::Base 
    default_scope -> { order("locations.name ASC") } 
end 

나는 다음과 같은 데이터베이스 쿼리가 수행됩니다 Location.last (15)를 호출 할 때 Ruby에서 결과 집합은 마지막 15 개의 배열 요소로만 필터링됩니다. 위치 테이블에 실제로 많은 양의 항목이 있으면 본질적으로 모든 항목을 가져 와서 데이터 세트를 마지막 15 개 항목으로 잘라냅니다.

이 경우 default_scope의 반대 인 자체 메서드를 작성하는 것이 더 적합합니다.

적합한 인덱스가 존재하는지 확인하는 것이 좋습니다