2012-06-05 91 views
0

目前我正在研究應該被很多人使用的項目。我擔心數據存儲讀/寫/小操作使用的資源過多。由於我對appengine很陌生,是否有任何有效的方法來使這些數字更小?我想過使用memcache,但它不是最安全的方式。另外它是一個好主意,利用搜索數據存儲實體:什麼是在谷歌appengine中使用數據存儲的最有效方式?

SELECT __key__ FROM table 

然後使用:

....#code 
table.get_by_id(entity.id()) 
....#code 

非常感謝。

+2

'table.get_by_id(entity.id())'這個部分沒有意義。你已經有實體了,你再次得到它... – aschmid00

+0

@ aschmid00讓我們來說一下。 '結果= db.GqlQuery( 「SELECT __key__ FROM聊天」)' '#some_code' '#讓我們說,我需要一些entity' '有人= chats.get_by_id(結果[0] .ID() )'' #...'' = somebody.name 「無所謂」'' somebody.put()' 如果有這樣做的沒有更好的辦法我會很高興,如果你能告訴我。 – Vizualni

+1

'results [0]'是一個關鍵,爲什麼不''db.get(results [0])'?!我認爲'get_by_id'會重建一個關鍵對象以從數據存儲中獲取它......不確定這一點,但我認爲它的這種往返方式太多了。 – aschmid00

回答

8

由於它看起來像您使用的是python,我強烈推薦使用新的數據存儲API NDB

NDB自動使用memcache將其模型緩存在幕後,而無需您做任何額外的工作。當然你也應該看看手動使用memcache,ndb不是一個銀色的子彈。但它會幫助你免費,這總是很好。

除了提高性能之外,它還是應用程序引擎數據存儲的更清晰的界面。它也有清晰的支持bulk operations,這也可以提升性能。

2

在Google App Engine中使用數據存儲的最高效率是......不使用數據存儲區!這很慢。

儘可能使用memcache。什麼是關於memcache的「不安全」?這當然是一個不尋常的批評。

此外,如果您知道實體的密鑰或ID,只需將其直接加載與get_by_key_name

+0

那我該用什麼? :) 我的意思是說memcache不安全是因爲命中率並不總是100%,內存不會永遠存在:)。 – Vizualni

8

對於經常讀取和寫入不太頻繁的數據,請在數據存儲前使用memcache。讀取時,首先檢查數據是否在memcache中,如果不是,請從數據存儲中讀取數據,然後將其存儲在memcache中供將來讀取。在通過鍵讀取實體的簡單情況下,您可以將每個實體按其數據存儲區密鑰存儲在內存緩存中。對於查詢,您必須決定是否值得將結果集存儲在memcache中,並以查詢參數爲關鍵字。

當您編寫時,您可以刪除memcache值,它會在下次閱讀時重新加載。你必須忍受刪除失敗的可能性。通常,您在memcache值上設置了到期時間,因此舊值不會很長。請注意,對於每秒很多次讀取,即使很短的到期時間,也可以獲得顯着的性能提升。

您也可以以與其他耗時的數據操作(例如網址提取)或計算值(例如複雜模板文本)相同的方式使用memcache。在所有這些情況下,如果memcache值已被清除,您將回退到主要來源,因此您可以獲得讀取性能,而不會丟失對數據的訪問權限。

其他性能提示:儘可能使用批處理調用來減少RPC的數量。在可能的情況下使用異步調用,以便在應用程序可以做其他事情時阻止服務調用。使用AppStats可視化您的服務調用並找到異步調用可能有所幫助的區域。

關於你的按鍵提問:一般來說,做一個只有鍵的查詢,然後立即通過鍵來獲取結果實體並沒有幫助,因爲這就是全實體查詢所做的事情。但是,如果您需要從查詢結果中選擇性地獲取數據,或者如果在一個地方查詢關鍵字並從另一個地方獲取關鍵字是有意義的,那麼這些就是可能性,而且您不會損失太多。我經常使用僅用於鍵的查詢。另請參閱投影查詢,以獲取僅(索引)屬性的子集。

1

不,沒有理由只執行一個鍵的查詢,然後單獨獲取實體,除非您只想檢索由返回鍵標識的一些實體。如果這樣更有效,數據存儲會爲你做。只要做一個定期的查詢。

相關問題