對於經常讀取和寫入不太頻繁的數據,請在數據存儲前使用memcache。讀取時,首先檢查數據是否在memcache中,如果不是,請從數據存儲中讀取數據,然後將其存儲在memcache中供將來讀取。在通過鍵讀取實體的簡單情況下,您可以將每個實體按其數據存儲區密鑰存儲在內存緩存中。對於查詢,您必須決定是否值得將結果集存儲在memcache中,並以查詢參數爲關鍵字。
當您編寫時,您可以刪除memcache值,它會在下次閱讀時重新加載。你必須忍受刪除失敗的可能性。通常,您在memcache值上設置了到期時間,因此舊值不會很長。請注意,對於每秒很多次讀取,即使很短的到期時間,也可以獲得顯着的性能提升。
您也可以以與其他耗時的數據操作(例如網址提取)或計算值(例如複雜模板文本)相同的方式使用memcache。在所有這些情況下,如果memcache值已被清除,您將回退到主要來源,因此您可以獲得讀取性能,而不會丟失對數據的訪問權限。
其他性能提示:儘可能使用批處理調用來減少RPC的數量。在可能的情況下使用異步調用,以便在應用程序可以做其他事情時阻止服務調用。使用AppStats可視化您的服務調用並找到異步調用可能有所幫助的區域。
關於你的按鍵提問:一般來說,做一個只有鍵的查詢,然後立即通過鍵來獲取結果實體並沒有幫助,因爲這就是全實體查詢所做的事情。但是,如果您需要從查詢結果中選擇性地獲取數據,或者如果在一個地方查詢關鍵字並從另一個地方獲取關鍵字是有意義的,那麼這些就是可能性,而且您不會損失太多。我經常使用僅用於鍵的查詢。另請參閱投影查詢,以獲取僅(索引)屬性的子集。
'table.get_by_id(entity.id())'這個部分沒有意義。你已經有實體了,你再次得到它... – aschmid00
@ aschmid00讓我們來說一下。 '結果= db.GqlQuery( 「SELECT __key__ FROM聊天」)' '#some_code' '#讓我們說,我需要一些entity' '有人= chats.get_by_id(結果[0] .ID() )'' #...'' = somebody.name 「無所謂」'' somebody.put()' 如果有這樣做的沒有更好的辦法我會很高興,如果你能告訴我。 – Vizualni
'results [0]'是一個關鍵,爲什麼不''db.get(results [0])'?!我認爲'get_by_id'會重建一個關鍵對象以從數據存儲中獲取它......不確定這一點,但我認爲它的這種往返方式太多了。 – aschmid00