我有一個基於GAE的項目,使用db
Datastore
。在我的項目中,我每15分鐘運行一次作業,並更新Datastore
中的數據。然後我有一個端點查詢Datastore
並顯示結果。但是,我得到的結果是陳舊的,而不是更新的結果。看來GAE沒有打到Datastore
並從緩存中返回數據,但我不確定。這裏是我的代碼:Google App Engine數據存儲查詢返回陳舊數據
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"}))
這裏是我的模型:
class Contests(db.Model):
"""Models Contests"""
data = db.TextProperty(default="{}")
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
我嘗試使用memcache.flush_all()
但即使是不解決問題的清除緩存。爲什麼GAE不返回更新的數據?我該如何解決這個問題?
編輯:我改變了查詢祖先查詢,但數據仍舊陳舊(和它是天)。
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 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
獲取數據:
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數據存儲?我在這裏錯過了什麼?
Patrice的回答是正確的 - 舊的crufty'db'並不會透明地爲你緩存,你需要新的偉大的'ndb'(當然,通過使用自定義上下文來控制),所以遇到的問題'db'不能由於緩存,必須與最終一致性相關, – 2015-02-07 19:31:49
最終一致性需要1-2秒才能解決。如果您的數據超出了「陳舊」,那麼您的代碼中就有一個問題。 – 2015-02-07 19:35:34
@AndreiVolgin,第二個或通常更少是* typical *,但沒有保證最壞情況延遲的上限。現代子系統(如ndb)的用戶幾乎從未觀察到,因爲memcache **具有強烈的一致性(雖然是volatile) - 但是對於舊的crufty db來說更加突出,反正「幾乎沒有」與「never」一樣: - )... – 2015-02-07 19:47:31