2011-12-14 69 views
2

我目前正在實現提供遊戲社交功能的Web服務。這種遊戲功能之一是管理好友列表的能力。用戶可以添加的朋友取決於他在他選擇的外部社交網絡(當前是Facebook或Twitter)上的聯繫人。根據數據存儲篩選大型數據集的最佳方法

系統的當前行爲如下:

  • 客戶端應用程序使用的社交網絡(Facebook或Twitter)API來獲取玩家的聯繫人列表。
  • 每個這種接觸提供了一個獨特的識別碼(即社交網絡他源自,它這個社交網絡上的標識,如「Tw12345」)。
  • 客戶端將所有這些標識符的列表發送到GAE上託管的遊戲Web服務。
  • Web服務檢查每個標識符是否有用戶在他自己的數據庫中匹配。
  • 它返回一個標識符列表,過濾後只包含那些在遊戲數據庫中也有匹配的標識符。

這顯然不能很好地工作,因爲大多數用戶的聯繫人列表是巨大的。服務器花費大量時間檢查數據庫以篩選哪個聯繫人具有匹配的遊戲帳戶。現在

,我有一個很難搞清楚我如何才能更有效地進行。由於標識符未遵循任何給定順序,因此我無法使用整數操作來選擇數據庫上的用戶。另外,我不能依靠Twitter或Facebook來進行他們的過濾,因爲這不受他們的API支持。我想到一個系統使用某種memcached數據樹來存儲「已知」標識符列表(因爲查詢只需要知道有一個匹配的用戶,而不是哪個用戶完全匹配),但我'害怕高速緩存在任何時候被清除時需要花費的時間。

如果你們有這樣一套相關的麻煩的經驗,我會很高興聽到它!謝謝!

+0

謝謝你的有趣問題。如果我理解正確,你想知道哪些元素是兩個集合的成員,即聯繫人和已經是玩家。如果這確實是你想要找到的2套共同元素應該是可行的。如果我沒有弄錯,你的web服務可能只需要2個列表作爲輸入和輸出,無論這兩個列表中的元素是什麼。我可能會錯誤地提出需求,如果您發佈一些實際的編碼工作,我們可能會幫助您更多。無論如何,+1我發現一個問題真實而有趣。 – 2011-12-14 18:19:48

回答

2

我認爲這很慢,因爲您正在爲每個查找的用戶查詢。您可以避免使用密鑰名稱來完成此操作。

對於數據庫中的每個用戶,與他們的鍵名插入實體設置爲社交網絡的唯一標識。這些可以是您已經使用的相同實體,也可以是專爲此創建的新「索引」實體。

當發送標識符的列表,只需做一個批量get操作該實體的所有鍵名,以確定他們是否存在 - 例如,通過做MyKind.get_by_key_name(key_names)

+0

不幸的是,我已經在使用基於密鑰的訪問。最大的問題是,由於我沒有辦法在一個查詢中「分組」多個用戶,所以我不得不爲每個潛在用戶執行一個查詢。使用標準的Twitter帳戶,它可以變得非常高。我的原因是〜300`datastore_v3.Get`調用。 – Tyn 2011-12-15 12:08:45