0

我相信我有一個相當典型的用例,這是非常困難的,最終的一致性。我想知道是否有人已經創建了一個python框架來幫助解決這個問題。框架,以幫助App Engine的最終一致性+緩存

我有一個GET請求發出一組實體的查詢。他們很少更新。 我有POST請求一次更新一個實體,更新實體會影響它們是否出現在GET請求中。

由於實體很少發生變化,我想長時間memcache GET請求,比如說幾天或幾周。所以在難得的機會我得到一個POST來更新一個實體,我可以清除memcache。

如果我處理POST請求,更新實體,清除緩存並在不久之後進入GET請求,最終一致的數據存儲查詢可能會顯示舊的查詢結果,然後將被memcached用於接下來的幾天或幾周。

而不是簡單地更新數據存儲,清除緩存,我需要:

1. update the datastore 
2. get the cached query 
3. modify the cached query (with the proper sorting too!) 
4. update the cache with the new modified query results (with a cas() operation) 

這似乎是一個常見的問題不夠。有沒有可以幫助緩解這個問題的Python框架?

ndb沒有幫助,因爲數據存儲區查詢繞過了所有緩存。

如果重要,我目前使用的是django-nonrel,而django-tastypie則處理GET請求。

+0

緩存查詢是任意困難 - 因爲沒有辦法一一列舉或查詢memcache,在一般情況下無法知道可能會緩存哪些查詢。我不認爲有辦法自動執行此操作:如果您想緩存查詢,則必須根據具體情況進行查詢。 –

回答

0

從我對GAE的memcache的理解/經驗來看,除非您駕駛的交通量非常大,否則您的數據將被驅逐,但即使如此,它也是not guaranteed

但是,我認爲您應該能夠使用Ancestor queries,因爲它們通過將查詢範圍限制爲實體組來提供強一致性。從文檔:

要獲得強烈一致的查詢結果,您需要使用 祖先查詢將結果限制爲單個實體組。這個 的作品,因爲實體組是一致的單位以及 事務性。所有數據操作都適用於整個組; 祖先查詢將不會返回其結果,直到整個實體 組爲最新。如果您的應用程序依賴於針對某些查詢的強烈一致的 結果,則在設計數據模型時可能需要考慮此問題 。

假設您的GET請求與某種用戶或其他可識別的「父」相關聯,或者您可以創建一個由所有實體共享的全局父項,您將能夠使用該請求父母爲了檢索強烈一致的發送。

Here's an example from the docs.

這裏還有一個相關的問題,我問,這顯示了設置父鍵和便於查詢ID一些不錯的招數:NDB using Users API to form an entity group