2012-12-11 4 views
9

관찰자와 스위퍼는 레일 4에서 제거됩니다. 하지만 캐시를 캐시하고 지우는 방법은 무엇입니까?스위퍼가없는 레일에서 캐시를 삭제하는 올바른 방법은 무엇입니까

러시아 인형 캐싱에 대해 읽었습니다. 그것은 좋지만보기 렌더링 캐시에만 관련됩니다. 데이터베이스가 손상되는 것을 막지는 않습니다. 예를 들어

는 :

<% cache @product do %> 
    Some HTML code here 
<% end %> 

당신은 여전히 ​​cache_key를 얻을 수있는 DB에서 @product을 얻을 필요가있다. 따라서 페이지 또는 액션 캐싱은 불필요한로드를 방지하는 데 여전히 유용 할 수 있습니다.

가끔 캐시를 지우는 데 시간 초과를 사용할 수 있지만 레코드가 변경되지 않은 경우는 어떻게해야합니까?

적어도 스위퍼를 사용하면 해당 부분을 제어 할 수 있습니다. 무엇이/오른쪽 캐시를 수행하고 그것을 지우는 방법은 무엇입니까?

감사합니다. : 컴퓨터 과학의 두 가지 어려운 문제 중 하나

답변

8

오신 것을 환영합니다, 캐시 무효화 :

당신은 캐시보기와는 달리 캐시 된 개체가, 간단하게 할 수있는 경우에 대한 논리 때문에 그 수동으로 처리해야 할 것입니다 그것이 표시하는 객체에서 파생 된, 응용 프로그램 및 상황에 따라 무효화되어야합니다.

이 방법은 Rails.cache.fetch 방법입니다. Rails.cache.fetch은 3 개의 인수를 취합니다. 캐시 키, 옵션 해시 및 블록이 있습니다. 먼저 키를 기반으로 유효한 캐시 레코드를 읽으려고합니다. 그 키가 존재 해, 기한이 지났을 경우는, 캐쉬로부터 값을 돌려줍니다. 유효한 레코드를 찾을 수 없으면 대신 블록에서 반환 값을 가져 와서 지정된 키를 사용하여 캐시에 저장합니다. 예를 들어

는 :

@models = Rails.cache.fetch my_cache_key do 
    Model.where(condition: true).all 
end 

이 블록을 캐시 뭔가 (TM)을 재평가 할 블록을 강제로 키를 무효화 될 때까지 그 결과를 다시 사용합니다. 또한 메서드 체인의 끝에 .all에 유의하십시오. 일반적으로 레일스는 캐쉬 될 ActiveRecord 관계 객체를 반환 할 것이고 이것은 처음으로 @models을 사용할 때 평가되어 캐시를 깔끔하게 제거합니다. .all 호출은 Rails가 레코드를 열렬하게로드하고 그 레코드가 질문이 아니라 캐시하는 결과인지 확인합니다.

이제 모든 캐시를 가져오고 데이터베이스와 다시는 대화 할 필요가 없기 때문에 캐시를 무효화하여 다른 쪽을 처리해야합니다. 이것은 단순히 캐시 키를 가져와이를 제거하는 다음 방법을 사용하여 수행됩니다. 다음 번에 캐시 키를 가져 오려고하면 실패합니다. fetch와 함께 force: true 옵션을 사용하여 강제로 블록을 다시 평가할 수도 있습니다. 어느 쪽이든 당신에게 어울립니다.

과학은 모두 Rails.cache.delete으로 전화를 걸 수 있습니다. 순진한 경우 이것은 단일 인스턴스에 대해 업데이트 및 삭제되고 컬렉션의 모든 구성원에 대해 업데이트, 삭제, 생성 될 것입니다. 모서리 케이스가 항상있을 것이고 항상 응용 프로그램에 따라 다르므로 많은 도움을 드릴 수는 없습니다.

이 대답에서 memcached 또는 Redis와 같은 일부 정상적인 캐시 저장소를 설정한다고 가정합니다.

config.cache_store = :null_store 

또는 개발 환경 캐시합니다 그리고 당신은 좌절에서 털이를 종료합니다 :

또한 설정/환경/development.rb이를 추가해야합니다. 상기 기준 읽기

: Everyone should be using low level caching in RailsThe rails API docs

또한 해당 기능을 주목할 가치가 레일 (4)로부터 제거하지 않고, 단지 일품으로 추출 하였다. 스위퍼의 모든 기능을 필요로하거나 원하신다면 Gemfile에 gem 'rails-observers' 줄이있는 앱에 다시 추가하십시오. 이 보석에는 Rails 4 코어에서 제거 된 스위퍼와 옵저버가 포함되어 있습니다.

시작 하시길 바랍니다.

+0

캐시 무효화에 관해서는 스위퍼 (sweepers) 역할로 다시 돌아갈 것입니다. 내 컨트롤러에서'Rails.cache.delete'를 호출하는 대신 외부화된 보석에서 스위퍼를 사용할 수있었습니다. 나는 그 경우에 그것이 의미가 있다고 생각합니다, 그렇죠? 답장을 보내 주셔서 감사합니다 :) – Happynoff

+0

예, 스위퍼의 역할은 작업 캐시 전략의 전제 조건 중 하나이기 때문에 빠져 나오기가 어렵습니다.) 일반적으로 캐시 무효화, 메시징 및 외부 모델과의 상호 작용. 그렇게하면 깨끗한 컨트롤러와 작은 핵심 클래스가 있으며 기본 클래스를 청취하는 다른 클래스에서 불필요한 동작을 수행 할 수 있습니다. 본질적으로 스위퍼는 이러한 라이프 사이클 클래스 중 하나의 특수화 된 사례 일 뿐이며 본질적으로 전략으로서의 잘못된 것은 없습니다. –

+0

그래서 Rails 4에서 스위퍼 제거에 대해 이상하게 느껴집니다. 페이지/액션 캐싱이 좋지 않지만 낮은 수준의 캐싱에는 여전히 스위퍼 또는 스위퍼와 같은 동작이 필요하기 때문에 이해할 필요가 없습니다. ( – Happynoff

관련 문제