2010-06-26 126 views
4

好吧,我的問題有點複雜,但這裏有雲:版本比較JSON文檔

我有一個存儲客戶端(JavaScript編寫的)會話一個Python服務器,並具有客戶端當前已存儲了什麼完整的知識在它的狀態。

服務器將不斷地從數據庫中獲取數據,並檢查是否有針對客戶端的狀態進行任何更改。數據是JSON;主要由名單和字典組成。我需要一種方式向客戶端發送響應,告訴它改變其數據以匹配服務器的數據。

我已經考慮:

  • 發送更改的元素和 沒有使用過名單的JSON序列化遞歸 顯示差異字典 - 不壞,但我 不能用鏈表
  • 發送整個客戶端狀態到客戶端的服務器版本 - 昂貴和低效
  • 尋找一些令人費解的方式diff的名單 - 痛苦和混亂的
  • 基於文本的差異這兩個傾銷後作爲JSON - 平原愚蠢

我很難住這個,我很感激任何幫助。

UPDATE

我考慮派遣零點到客戶端刪除不再需要的數據和服務器已經從它的版本客戶端狀態的去除。

回答

3

相關問題

有幾種可能的方法:

  1. 做一個實際的樹分析遞歸diff;
  2. 封裝你JSON的更新,使得它們產生在同一時間的差異;
  3. 直接從您的數據生成僅更改的JSON。

你有什麼預期的平均值和最大尺寸客戶端狀態JSON?

你有什麼預期的平均值和最大尺寸差異更新?

多久會更新請求?

的速度有多快呢基礎數據的變化?

爲什麼你不能使用列表?

您可以只存儲最後一次已知的客戶端狀態時間戳並查詢數據庫以查找自那時起已更改的項目 - 有效地,讓數據庫爲您執行差異。這將需要每個表項上的最後更改的時間戳和項目刪除標誌;而不是直接刪除項目,設置項目刪除標誌,並有一個清理查詢,該項目刪除所有記錄,其中項目刪除標誌設置超過兩個完整更新週期前。

查看一些示例數據可能會有幫助 - 兩組JSON客戶端狀態數據以及它們之間的差異。

+0

碰巧,我和早上一個人對彼此都不太好 - 出於某種原因,我當時認爲列表無序。現在我已經擺脫了這種奇怪的,奇怪的思維,我可以更清楚地思考一切。 – Rob 2010-06-26 23:32:45

+0

列表是按順序排列的,但對象Keys不是,這使得純粹使用文本差異的想法出現皺摺,將一個json字符串與另一個json字符串進行比較。但是,如果按鍵總是被排序,則應該使用簡單的文本差異。服務器將不得不保留客戶端發送的實際文本進行比較。這取決於您是希望客戶端「知道」哪些字段發生了變化,或者您是否只想用盡可能短的消息將客戶端更新爲新狀態。文本差異會實現一條短消息,但不會通知客戶端哪些字段已更改。 – 2011-08-17 21:25:53