1

考虑 N 个数据源,每个数据源都有一个事件流

Event{
    long id;
    Object data;
}

一个流中的一些事件可能具有相同的 id,因为事件可能跨越更新、新等。所以我们可以看到以下两个流:

<1, 2, 3, 1, 5, 2>
<3, 3, 4, 5, 4>

我现在想将这些组合成一个流,每个订单 ID 肯定是唯一的。

简单的方法是使用 String 而不是 long 并附加源编号,生成类似:

<"1 - 1", "1 - 2", "1 - 3", "2-3", "2-3" ... >

有没有更多的记忆coimpact方式/更好的方法?

4

2 回答 2

1

您的 String 解决方案很好,实际上很常见。如果您有兴趣使其更紧凑,您可能需要使用整数元组。

分布式系统中使用的另一种常用方法是使用范围分配:有一个中央(单例)服务器分配范围,每个客户端可以在其中命名其 ID。例如,这样的服务器可以将范围 0-99 分配给 client1,将 100-199 分配给 client2 等。当客户端用尽分配的范围时,它会再次联系服务器以分配新的范围。

于 2012-11-22T15:39:37.387 回答
0

根据您的流/事件编号的范围,您可以将这两个数字组合成一个 int 或 long,将流编号放在这么多位的顶部,将事件编号放在这么多位的底部。例如:

public static int getCombinedNo(int streamNo, int eventNo) {
    if (streamNo >= (1 << 16))
      throw new IllegalArgumentException("Stream no too big");
    if (eventNo >= (1 << 16))
      throw new IllegalArgumentException("Event no too big");
    return (streamNo << 16) | eventNo;
}

对于您提到的类型的典型字符串,这将仅使用每个 int 4 个字节,而不是按(比如说)50-ish 字节的顺序。(在这种情况下,它还假设流和事件编号都不会超过 65535。)

但是:你的字符串解决方案也很好很清晰。内存真的那么紧,以至于您无法为每个事件节省额外的 50 个字节吗?

于 2012-11-22T16:26:40.040 回答