2009-08-03 2 views
3

테이블의 모든 모델을 캐싱 (및 만료)해야합니다.테이블의 모든 모델 캐시

예를 들어 Currency라는 모델이있는 경우 가능한 통화가 10 개 미만입니다. 따라서이 좋을 것이다 :

Currency.all 
Currency.find_by_name("USD") 

가 DB에 충돌하지 않도록

class Currency < ActiveRecord::Base 
    cache_all(:expire_in => 10.minutes) 
end 

있도록.

좋은 접근 방법이 무엇이라고 생각하십니까?

또한 DB로 백업되지 않은 모델을 사용하는 것이 더 나을 것이라고 생각되면 이에 대해 의견을 말하십시오. AR 스타일의 협회를 갖고 싶습니다.

답변

7

데이터 세트가 너무 작기 때문에 로컬 메모리에 캐시하는 것이 가장 좋습니다. 이를 수행하는 몇 가지 방법이 있는데, 하나는 Memoization like I show here입니다. 그러나 동일한 개체 인 경우에도 all 메서드와 find_by_name 메서드를 별도의 캐시에 저장하므로 가장 효율적이지 않습니다.

다른 방법은 개체를 수동으로 캐시하는 방법을 다시 정의하는 것입니다. 이 같은.

class Currency < ActiveRecord::Base 
    def self.all 
    @all_cache ||= super.map(&:freeze) # freeze so you don't modify the cached objects 
    end 

    def self.find_by_name(name) 
    all.detect { |c| c.name.to_s.downcase == name.to_s.downcase } 
    end 

    def self.flush_all_cache 
    @all_cache = nil 
    end 
end 

이 문제를 처리 할 수있는 플러그인이있을 수 있지만 전혀 조사하지 않았습니다.

+0

감사합니다. Ryan :). 나는 또한 cached_model 보석을 발견했다. 그러나 그것은 조금 오래되는 것처럼 보인다. 나는 그것을 시험해 볼 것이다. –

+0

한 가지주의 할 점은 여러 서버를 실행중인 경우 데이터가 변경되면 데이터를 변경 한 서버뿐 아니라 _all_ 서버에서 메모리 내 캐시를 지워야한다는 것입니다. –