【问题标题】:Duplicate millisecond timestamp issue重复的毫秒时间戳问题
【发布时间】:2014-01-19 17:22:32
【问题描述】:

我正在尝试通过 Websockets 将消息快速发布到我的服务器。对于服务器获取的每条消息,我将其以“时间戳:消息”的形式存储在我的 HashMap 中。我需要 HashMaps 来按时间顺序返回消息的历史记录以及所需的时间戳。 (欢迎任何其他数据结构推荐。)

碰巧当我快速发布消息时,两条或多条消息具有相同的时间戳,因此我无法保存它们。我已经在使用System.currentTimeMillis()。我无法进入纳秒,因为我读取的值是任意的并且通常不可靠。

我尝试在时间戳末尾附加一个静态 AtomicInteger 变量,它可以工作,但是当我将消息返回给我的用户时,我需要返回一个 JSON,但我再次无法存储重复键。

我该如何解决这个问题?

【问题讨论】:

  • 抱歉将其移至答案,因为它太长了;)
  • 时间戳作为唯一属性本身可能不可靠并且必然会发生冲突
  • @OP 我知道。您的问题并没有明确说明您需要时间戳用于除密钥之外的任何其他目的。请编辑您的问题以解释您的用例。
  • 您的系统将值定义为重复,您可以检查消息内容和时间戳的组合是否唯一。如果它失败了,那么你实际上是在产生重复。
  • 为什么不使用currentTimeMillis,附加nanoTime

标签: java data-structures hashmap duplicates


【解决方案1】:

您需要绝对时间戳吗?也许一个计数器 - 即知道ab 之前到达 - 就足够了,有一个计数器,当消息到达时你会增加它并将其用作你的“时间戳”。不再重复,时间顺序仍然完好。

此外,如果您不坚持使用地图,也可以只使用 FIFO 队列。这也将保持时间顺序。

【讨论】:

  • 我需要时间戳:)
  • 关注点分离 - 为您的 HashMap 使用通用 ID,并将时间戳作为地图值中业务对象的一部分。
  • 我最终以{timestamp+count: "Message"} 的格式存储消息,并将其标记为帮助我实现它的写答案。
猜你喜欢
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多