1

警告,我希望我问的是正确的问题,请随时提出替代方案。

情况; 我有一个主要用 javascript 编写的网站,可以在固定和移动设备上运行。该网站的数据量很大。它映射了大量移动对象和其他交互。每个客户端每隔几秒就会收到来自服务器的数据更新,因此,我需要尽量减少发送的数据量。目前,服务器会发送一个相当大的散列,其中包含每次更新时所有对象的当前状态。这是非常低效的,因为大部分数据保持不变。

我相信,以最少的编码和测试对发送的数据量产生最大影响的方法是每次更新时只将更改发送到散列。

所以,我想知道是否有任何久经考验的方法可以将上次发送的数据(哈希)与将要发送的数据(哈希)进行比较,提取差异,然后将差异应用于哈希javascript方面?我希望这是有道理的?

当我说比较时,我指的是键和值。目前哈希没有以任何特定方式排序,但是如果需要的话,这不是问题。

我看过 Data::Compare 之类的东西,但它似乎只是告诉我哈希是否不同,而不是区别是什么(除非我读错了?)。

4

2 回答 2

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: {
    },
    ...
  }
}
于 2012-05-25T15:54:55.767 回答
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

于 2012-05-26T13:28:36.047 回答