2011-09-17 5 views
1

Django로 캐싱 할 때 일반적인 패턴 중 하나는 각 캐시 키에서 현재 사이트의 ID를 사용하여 본질적으로 키의 네임 스페이스를 지정하는 것입니다. 문제는 내가 모두 값을 네임 스페이스 (예 : 근본적인 변경을했기 때문에 사이트 45의 모든 캐시 값 삭제)에서 캐시에 삭제할 수 있기를 바랍니다. 이 패턴을 다루는 현재 패턴은 곳곳에 신호를 전송합니다. 다른 사람들이 인식 할 수있는 일반적인 패턴이기 때문에 Site.id 캐시 키 예제를 사용했지만 사용자 정의 멀티 테넌트의 캐시를 사용하는 방식입니다. 응용 프로그램은이 문제를 더욱 심오하게합니다. 그래서 제 질문은 : 캐시 백엔드 및/또는 패턴이 네임 스페이스 방식으로 또는 pseudo-namespaced 방식으로 삭제하는 데 적합합니다. 주어진 네임 스페이스에 대한 가능한 모든 캐시 키를 통해 각각에 대한 캐시 삭제)? 나는 memecached를 사용하는 것을 선호하지만, 잘 작동하는 모든 솔루션에 개방적입니다.Django/general 캐싱 관련 질문

답변

2

큰 키 카테고리를 삭제하는 것은 일반적으로 어렵습니다. 더 나은 접근법은 각 사이트가 연관된 세대 번호를 갖는 것입니다. 생성을 1에서 시작하십시오. 해당 사이트의 캐시 키에 세대 번호를 사용하십시오. 근본적인 변경을하거나 사이트의 전체 캐시를 무효화하려는 경우 사이트 생성 번호를 증가시킵니다. 이제는 모든 캐시가 새로 캐시 될 때까지 모든 캐시 액세스가 누락됩니다. 모든 이전 데이터는 여전히 캐시에 있지만 오래된 데이터는 폐기되고 더 이상 액세스되지 않습니다.

이 스키마는 모든 이전 데이터를 찾거나 만질 필요가 없기 때문에 매우 효율적입니다. 또한 캐시 내용의 모든 클래스로 일반화 될 수 있으며 사이트마다있을 필요는 없습니다.

+0

이 코드는 데이터 변경에 대한 DB 레코드를 캐시 버전을 제어하도록 유지하지 않는 한 데이터 변경이 아니라 코드 변경에 사용됩니다. 따라서 사용자가 광범위한 데이터 변경을 초래하는 항목을 변경하는 경우 캐시 변경 사항을 기록하지 않고 캐시 버전을 증가시킬 수 없습니다. – orokusaki

+0

맞습니다. 사이트 ID와 세대 번호가있는 db 테이블을 사용할 수 있습니다. 그게 문제 야? 실제로 최상의 시스템은 코드에서 상수를 가지며 데이터베이스에서 값을 가지며 함께 캐시 접두어를 결정합니다. 그런 다음 둘 중 하나가 변경되면 캐시가 무효화됩니다. –

1

장고의 Cache Versioning 지원, 장고 1.3의 새로운 느낌.

그것은 당신이 당신의 캐시에 시스템 전체 변수 VERSION을 설정할 수 있습니다, 또는 기록을 만들 때 명시 적으로 설정할 수 있습니다 :이 방법

cache.set("mykey", True, version=2) 

을 당신이 당신의 캐시를 업데이트해야 할 때 간단하게, VERSION을 올리면 분명합니다.

+0

감사합니다. Ned의 답변에 대한 내 의견을 참조하십시오. – orokusaki