3

如果我在Google AppEngine中使用,那麼鍵名是什麼樣的字符串?它使用Unicode字符還是二進制字符串?AppEngine數據存儲區密鑰名稱中允許的字符

更具體地說,如果我想讓我的密鑰名由8位二進制數據組成,有沒有辦法做到這一點?如果沒有,我可以至少使用7位二進制數據嗎?還是有任何保留值?例如,它是否使用NULL作爲字符串結束標記?

回答

2

GAE文檔沒有對關鍵字字符串指定任何限制。因此,任何含有的字符串應該有效。

如果您想使用二進制數據作爲標識符,那麼您應該將其編碼爲一個字符串。您可以使用任何binary-to-text encoding方法:大多數使用似乎是Base64(3個字節= 4個字符)和BinHex(1個字節= 2個字符)。

+0

我遇到了一個重要的限制:'匹配正則表達式的名稱'__。* __'是保留/只讀的(參見[entity.proto](https:/ /github.com/google/googleapis/blob/master/google/datastore/v1beta3/entity.proto#L54),它定義了密鑰的協議緩衝區佈局) – 2015-10-11 15:20:59

2

我同時有一段時間通過生成一串帶有二進制名稱的密鑰來實際測試這一點,然後執行一種僅用於查詢來獲取所有密鑰的查詢。這裏是結果:

  • 任何二進制字符是好的。如果您創建的密鑰名稱爲"\x00\x13\x127\x255"的實體,則查詢將查找此實體,並且其密鑰名稱將返回相同的字符串
  • AppEngine儀表板,數據庫查看器和其他工具將簡單地忽略不可顯示的字符,因此鍵名"\x00test"\x00\x00test都將顯示爲獨立的實體,但他們的鑰匙都顯示爲"test"
  • 測試所有可用的AppEngine工具,只是一些在控制檯的基礎知識,所以有可能是其他工具被這些密鑰弄糊塗...
  • 密鑰是UTF-8編碼的,因此128到255之間的任何字符佔用2個字節的存儲空間

從此,我就得出了以下建議:

  • 如果您需要能夠從AppEngine上的控制檯與各個實體的工作,需要通過按鍵來識別它們,您僅限於可打印字符,因此需要將二進制密鑰名稱編碼爲Base16(十六進制; 50%的開銷),Base64(開銷33%)或Base85(開銷25%)
  • 如果您不關心密鑰的可讀性,但需要儘可能多地將數據打包到密鑰名稱中,使用Base128編碼(僅即7位; 14%的開銷),以避免隱式UTF-8編碼的8位數據的數據(50%開銷!)

旁白:

我會接受@PeterKnego的答案,而不是這個,因爲這個基本上只確認和擴展關於他已經正確假設的事情。

從通過source code of the Java API看,我認爲,關鍵名稱的UTF-8編碼發生在API中(在構建protocol buffer),而不是在BigTable的,所以如果你真的想要去堅果在存儲空間最大化時,它可以建立自己的協議緩衝區並存儲完整的8位數據而無需開銷。但這可能是要求麻煩...

相關問題