오신 것을 환영합니다, 캐시 무효화 :
당신은 캐시보기와는 달리 캐시 된 개체가, 간단하게 할 수있는 경우에 대한 논리 때문에 그 수동으로 처리해야 할 것입니다 그것이 표시하는 객체에서 파생 된, 응용 프로그램 및 상황에 따라 무효화되어야합니다.
이 방법은 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 Rails 및 The rails API docs
또한 해당 기능을 주목할 가치가 레일 (4)로부터 제거하지 않고, 단지 일품으로 추출 하였다. 스위퍼의 모든 기능을 필요로하거나 원하신다면 Gemfile에 gem 'rails-observers'
줄이있는 앱에 다시 추가하십시오. 이 보석에는 Rails 4 코어에서 제거 된 스위퍼와 옵저버가 포함되어 있습니다.
시작 하시길 바랍니다.
캐시 무효화에 관해서는 스위퍼 (sweepers) 역할로 다시 돌아갈 것입니다. 내 컨트롤러에서'Rails.cache.delete'를 호출하는 대신 외부화된 보석에서 스위퍼를 사용할 수있었습니다. 나는 그 경우에 그것이 의미가 있다고 생각합니다, 그렇죠? 답장을 보내 주셔서 감사합니다 :) – Happynoff
예, 스위퍼의 역할은 작업 캐시 전략의 전제 조건 중 하나이기 때문에 빠져 나오기가 어렵습니다.) 일반적으로 캐시 무효화, 메시징 및 외부 모델과의 상호 작용. 그렇게하면 깨끗한 컨트롤러와 작은 핵심 클래스가 있으며 기본 클래스를 청취하는 다른 클래스에서 불필요한 동작을 수행 할 수 있습니다. 본질적으로 스위퍼는 이러한 라이프 사이클 클래스 중 하나의 특수화 된 사례 일 뿐이며 본질적으로 전략으로서의 잘못된 것은 없습니다. –
그래서 Rails 4에서 스위퍼 제거에 대해 이상하게 느껴집니다. 페이지/액션 캐싱이 좋지 않지만 낮은 수준의 캐싱에는 여전히 스위퍼 또는 스위퍼와 같은 동작이 필요하기 때문에 이해할 필요가 없습니다. ( – Happynoff