2014-12-21 8 views
0

오래 걸리지 않고 (~ 180ms) 내 레일 애플리케이션에서 쿼리를 받았지만 많은 결과를 반환합니다. 결과는 API에서 사용되며 결과를 JSON으로 변환하는 것은 비용이 많이 듭니다 (~ 3 초). 속도를 높이려면 다음과 같이 캐싱합니다.레일 : 쿼리 결과에 따라 캐시 무효화

key = 'new_prices' 
query = Prices.new_this_month.where('...') 
json = cache(key, expires_in: 60.minutes) do 
    render_to_string json: query, each_serializer: PriceSerializer 
end 
render json: json 

백그라운드에서 새로운 가격을 데이터베이스에 추가 할 수 있습니다. query의 결과가 변경되면 캐시가 무효화되는 방식으로 캐시 키를 생성 할 수 있습니까?

나는 레일스 3.2를 사용 중이며, dalli 보석을 통해 memcached를 사용하고 있습니다.

답변

0

범위가 new_this_month이므로 타임 스탬프가있는 Prices이 있다고 가정합니다. 이 경우 당신은 단순히 캐시 키에 최신 created_at을 사용할 수 있습니다 당신은 장소에 좋은 인덱스를 가지고 있다면

cache_key = "new_prices-#{Prices.order('created_at DESC').take.created_at}" 

, 이것은 매우 빠른 쿼리해야합니다.

+0

실제로 'created_at'날짜는 없지만 하나는 추론 할 수 있습니다. 또한 가격이 바뀌면 캐시가 무효화되지 않는다고 말하는 것이 옳은 것 같습니까? (나는'modified_at'을 가지고 있지 않습니다.) –

+0

예, 가정이 맞습니다. 당신은 당신의 질문에 이것을 언급하지 않았다. 프래그먼트가 캐시 된 이후로 가격이 업데이트되었는지 확인하는 방법이 필요합니다. 그렇지 않으면 유일한 옵션은 수동으로 캐시를 무효화하는 것입니다. – fivedigit