db
Datastore
을 사용하는 GAE 기반 프로젝트가 있습니다. 내 프로젝트에서는 매 15 분마다 작업을 실행하고 데이터를 Datastore
으로 업데이트합니다. 그런 다음 Datastore
을 쿼리하고 결과를 표시하는 끝점이 있습니다. 하지만, 내가 얻은 결과는 오래되어서 업데이트 된 것이 아닙니다. GAE가 Datastore
에 도달하지 못하고 캐시에서 데이터를 반환하는 것으로 보이지만 확실하지 않습니다. 여기 내 코드입니다 : 내가 memcache.flush_all()
를 사용하지만, 심지어 문제가 해결되지 않는 캐시를 지우고 시도부실 데이터를 반환하는 Google App Engine Datastore 쿼리
class Contests(db.Model):
"""Models Contests"""
data = db.TextProperty(default="{}")
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
:
class MainHandler(webapp2.RequestHandler):
def get(self):
query = Contests.all()
contests_data = query.fetch(1) # fetch the data from datastore
self.response.write(contests_data[0].data)
class DataBaseHandler(webapp2.RequestHandler):
# the job that runs every 15 minutes
def get(self):
contests_data = get_all_contests() # get the new data
query = Contests.all()
contests = query.fetch(1)
contests[1].data = contests_data # update the data
db.put(contests[0])
self.response.write(json.dumps({"message":"updated"}))
가 여기 내 모델입니다. 왜 GAE는 업데이트 된 데이터를 반환하지 않습니까? 어떻게 문제를 해결할 수 있습니까?
EDIT : 조상 쿼리로 쿼리를 변경했지만 데이터가 여전히 부실합니다 (며칠 전).
main.py
class MainHandler(webapp2.RequestHandler):
def get(self):
contest_list = ContestList.get_or_insert('contest_list', name='ContestList')
query = Contests.all()
query.ancestor(contest_list)
contests = query.fetch(1)
self.response.write(contests[0].data)
class DataBaseHandler(webapp2.RequestHandler):
def get(self):
contests_data = get_all_contests()
contest_list = ContestList.get_or_insert('contest_list', name='ContestList')
query = Contests.all()
query.ancestor(contest_list)
contests = query.fetch(1)
contests[0].data = contests_data
contests[0].put()
self.response.write(json.dumps({"message":"updated"}))
models.py
는 :
class MainHandler(webapp2.RequestHandler):
def get(self):
q = ndb.Key('Contests', 'contest_data').get()
if q:
self.response.write(q.data)
else:
self.response.write("error")
class DataBaseHandler(webapp2.RequestHandler):
def get(self):
Contests(key=ndb.Key('Contests', "contest_data"), data=get_all_contests()).put()
self.response.write(json.dumps({"message":"updated"}))
가 GAE의 데이터 저장소를 공격하지 않습니다 무엇 :
class ContestList(db.Model):
name = db.StringProperty()
class Contests(db.Model):
"""Models Contests"""
data = db.TextProperty(default="{}")
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
이 난 key
를 사용하여 데이터를 가져 오는 시도? 내가 여기서 무엇을 놓치고 있니?
Patrice의 대답은 정확합니다. 오래된 crufty db는 투명하게 캐싱하지 않습니다. (사용자 정의 컨텍스트를 사용하여 제어 할 수있는) 멋진 새 ndb가 필요합니다. 'db'는 캐싱으로 인한 것이 아니고, 결과 일관성과 관련되어야합니다. –
최종 일관성은 자체 해결을 위해 1 ~ 2 초가 소요됩니다. 데이터가 "오래된 것"이상이면 코드 어딘가에 문제가있는 것입니다. –
@AndreiVolgin, 두 번째 또는 종종 더 적은 * typical *이지만 최악의 경우 지연에 대한 보장 된 상한은 없습니다. memcache **가 강력하게 일관성이 있기 때문에 (그러나 휘발성 임에도 불구하고) 엔티티를 투명하게 캐시하는 'ndb'와 같은 현대 서브 시스템 사용자는 거의 관찰하지 않습니다.하지만 오래 된 crufty db로 더 눈에 띄며 언젠가는 거의 없습니다. "never"와 같은 것 : -) ... –