2012-04-06 3 views
2

NDB로 전환하는 중입니다. 두 모델 세트를 사용하고 있습니다 : 하나는 평범한 이전 google.appengine.ext.db이고 다른 하나는 새로운 google.appengine.ext.ndb을 기반으로합니다.NDB에서 특정 모델에 대한 캐시를 삭제하는 방법

읽기 전용으로 NDB 기반 모델을 사용하고 NDB에 내장 된 캐싱을 유지하면서 이전 모델을 사용하여 변경 사항을 저장할 수 있으며 필요할 때 캐시를 NDB로 업데이트 할 필요성을 알립니다. .

예 : db을 기반으로 한 모델의 변경 사항을 저장하는 동안 NDB의 특정 모델 인스턴스에 대해 캐시를 플러시/삭제할 수 있습니까?

답변

10

복제본에있는 모델 클래스에 대해 캐시를 비활성화하는 것이 좋습니다. 미안한 것보다 안전 할 것. 이것은 쉽게 각 ndb.Model 서브 클래스 내에서

_use_memcache = False 
    _use_cache = False 

를 넣어 이루어집니다 (즉, 이전 또는 속성 선언 후). 이 문서는 여기에 있습니다 : https://developers.google.com/appengine/docs/python/ndb/cache#policy_functions (끝 부분을 찾으십시오).

당신은 정말 당신이 위의 (A db.Model 서브 클래스의 인스턴스 인 엔트 가정) 다음 시도 할 수 있습니다 대신, 오래된 db.Model 서브 클래스를 사용하여 엔티티를 쓸 경우에만 캐시를 지우려면 :

ndbkey = ndb.Key.from_old_key(ent.key()) 
    ndbkey.delete(use_datastore=False) 

이렇게하면 memcache와 컨텍스트 캐시에서 키가 삭제되지만 데이터 저장소에서 삭제되지는 않습니다. 그러나 NDB 키를 사용하여 다시 읽으려고하면 (또는 쿼리 결과로 되돌아 오는 경우에도) 현재 HTTP 요청 처리기가 끝날 때까지 삭제 된 것으로 보이며 약 30 초 동안 memcache를 사용하지 않습니다 .

+0

캐싱은 NDB를 사용하는 이유 중 하나 였으므로 캐싱을 비활성화하면 목적을 달성 할 수 없으므로 모델이 거의 변경되지 않으므로 30 초 패널티가 작은 가격입니다. 나는'ndb.get_context() ._ clear_memcache ((ndbkey,)). get_result()'를 사용했지만'ndbkey.delete (use_datastore = False)'가 더 깨끗해 보였다. 고마워! : D –

+0

나는 30 분마다 새로운 값을 생성하고 데이터 저장소를 업데이트하는 실험을 해왔다. 심지어 위의 플래그를 사용하여 약 10 시간 동안 새 값을 성공적으로 저장할 수 있지만 그 후에는 새 값이 될 수 없다. 30 분 후에 다시 가져오고 이전 값을 얻습니다. 수동으로 지우면 새 값이 나타나기 때문에 캐시 문제라고 가정합니다. 어떤 충고? 감사! – Shaun

관련 문제