2010-09-23 30 views
3

我想向客戶端發送唯一引用,以便客戶端可以引用特定對象。 appengine提供的編碼鍵有時候有50個字節長,我可能只需要2或3個字節(我希望能夠用到4或5個字節,但這不會有一段時間!)。將編碼密鑰映射到appengine中的較短標識符

發送較大的密鑰實際上非常昂貴,因爲我可能一次發送400個引用。

所以,我想將這些長鍵映射到更短的鍵。一個明顯的解決方案是將映射存儲在數據存儲中,但是當我發送400個對象時,我正在執行400個附加查詢,對吧?也許我可以通過在memcache中保存映射副本來減輕費用。有沒有更好的辦法?

我可以將這個數字從appengine創建並使用它的未編碼密鑰中抽出嗎?我只需要我使用的任何身份證件就是每個實體類型的唯一身份證件,而不是整個應用程序。

感謝,

萊利

回答

5

數據存儲密鑰包括你不需要額外的信息 - 如應用程序ID。所以你絕對不需要發送整個密鑰。

如果這些引用是針對數據存儲庫中的特定類型的,那麼您可以做得更好,只需發送key_name或數字ID(無論您的密鑰使用哪個)。如果後者是這種情況,那麼你可以傳輸每個密鑰只有幾個字節(你可以選擇一個可變長度或固定長度的整數編碼,這取決於哪個對於你的特定情況會更緊湊[可能是前者直到大部分你發送的ID都相當大])。

當您從用戶接收到這些部分密鑰時,應該很容易重建您需要從數據存儲中檢索實體的完整密鑰。如果您使用的是Python運行時,則可以使用db.Key.from_path(kind_name, numeric_id_or_key_name)

像這樣的方案應該比試圖使用數據存儲/內存緩存來存儲自定義映射更簡單和(很多)。

+0

謝謝,這看起來不錯。我使用的是Java,並且http://code.google.com/appengine/docs/java/datastore/creatinggettinganddeletingdata.html看起來好像它將具有我需要清除您的答案的內容。我擔心自動生成的ID會很短(數字ID需要Long),但我認爲在最壞的情況下,保留我自己的IDS低位並自己生成它們仍然會,比發送整個編碼密鑰要好的多。謝謝! – 2010-09-26 13:07:50

1

您不需要自定義映射機制。只需使用實體鍵名來存儲你的短標識符:

entity = MyKind(key_name=your_short_id) 
entity.put() 

然後你就可以在一個查詢中獲取這些短identitiers:

keys = MyKind.all(keys_only=True).filter(...).fetch(400) 
short_ids = [key.name() for key in keys] 

最後,使用MyKind.get_by_key_name(short_id)以檢索標識由發回的實體你的用戶。