2012-05-25 76 views
1

警告,我希望我提出正確的問題,隨時提出其他建議。hw我可以比較兩個perl哈希(鍵和值)提取差異並將其應用於哈希值javascript

情況; 我有一個主要用JavaScript編寫的網站,它運行在固定和移動設備上。該網站數據量很大。它映射移動對象和其他交互的負載。每個客戶端都會每隔幾秒鐘收到一次服務器數據的更新,因此我需要儘量減少發送的數據量。目前,服務器發送一個相當大的散列,其中包含每次更新中所有對象的當前狀態。這是非常低效的,因爲大部分數據保持不變。

我相信這種方式會對發送數據的數量產生最大的影響,只有最少的編碼和測試,只是將更改發送到散列每次更新。

所以,我想知道是否有任何經過測試的方法比較上次發送的數據(散列),數據(散列)將被髮送,提取差異,然後應用差異在JavaScript端的哈希?我希望這是有道理的?

當我說比較時,我的意思是鍵和值。目前哈希不是以任何特定的方式排序的,但是如果他們需要的話,它不是問題。我看過像Data :: Compare這樣的東西,但它似乎只是告訴我,如果哈希是不同的,而不是差別是什麼(除非我讀錯了?)。

回答

3

我有同樣的問題發送差異的對象(JSON格式)從服務器到客戶端在一定程度上高頻率。我們提出的解決方案非常簡單。由於沒有官方或標準的方式來表達json對象之間的差異,我們想出了我們自己的協議,如何定義哪些對象被添加,哪些對象是更新(即這些對象的屬性發生了變化(添加/更新/刪除),並且對象被完全刪除

其中一個可能的增量有效載荷可能是:

{ 
    added: [ 
    /* array of new objects */ 
    ], 
    removed: [ 
    /* array of object identifiers that need to be removed */ 
    ], 
    updated: { /* key value pairs of object identifiers with their property maps */ 
    obj_id_01: { 
     updated: { /* key-value pairs of updated properties */ }, 
     removed: [ /* array of keys of removed properties in an object */ ] 
    }, 
    obj_id_02: { 
    }, 
    ... 
    } 
} 
+0

偉大的模型感謝您的建議。 – mark

1

我開發了類似的問題類似的解決方案..

my $bef = { 
    name => 'Fred', 
    wife => 'Wilma', 
    hobby => 'Breaking Rocks', 
    friends => [qw! Barney Wilma Betty !], 
}; 

my $aft = { 
    name => 'Fred', 
    pet => 'Dino', 
    hobby => 'Bowling', 
    friends => [qw! Barney Betty Dino !], 
    kids => [qw! Bam Pebbles !], 
}; 

my $differ = Lecstor::FeedProxy::Diff->new; 

my $diff = $diff->differences($bef, $aft); 

$diff: { 
    'pet' => 'Dino', 
    'wife' => undef, 
    'hobby' => 'Bowling', 
    'friends' => { 
    'remove' => [ 'Wilma' ], 
    'add' => [ 'Dino' ] 
    }, 
    'kids' => { 
    'add' => [ 'Bam', 'Pebbles' ] 
    } 
}; 

https://github.com/lecstor/Lecstor/blob/master/lib/Lecstor/FeedProxy/Diff.pm

+0

也是一個很好的建議。我也會試試這個,看看哪一個最適合我們。我會回報。 – mark

+0

順便說一句,你在客戶端做了什麼以將差異應用於散列的客戶端副本? – mark

+0

這實際上是用於在Perl應用程序之間移動數據,但我不認爲我已經進入「應用」階段。 – lecstor