gpt4 book ai didi

java - 如何在java中生成增量标识符

转载 作者:行者123 更新时间:2023-11-29 03:41:28 25 4
gpt4 key购买 nike

我有一个要求,我不断收到需要写入文件的消息。每次收到新消息时,都需要将其写入单独的文件中。我想要的是生成一个唯一标识符以用作文件名。我也想保留消息的顺序。我的意思是,作为文件名生成的标识符应该始终是增量的。

我使用 UUID.randomUUID() 来生成文件名,但这种方法的问题是 UUID 仅确保标识符的随机性,而不是增量的。结果,我丢失了文件的顺序(我希望首先生成的文件应该首先出现在列表中)。

已知方法

  1. 可以使用 System.currentTimeMillis() 但我可以同时接收多条消息。

2. 另一种方法是实现静态长值并在创建文件时递增它,并将长值用作文件名。但我不确定这种方法。此外,它似乎不是解决我的问题的正确方法。我认为可能有比这个更好的解决方案。

如果有人可以建议我更好地解决这个问题,将不胜感激。

最佳答案

如果您希望您的 id 值甚至在服务器重新启动之间均匀上升,那么您必须将其基于系统时间或具有一些精心设计的稳健逻辑来保留上次使用的 ID。请注意,单独实现稳健性并不难,但以高性能和可扩展的方式实现稳健性却很困难。

如果您还需要 id 在冗余服务器集群中的多个节点之间是唯一的,那么您需要更复杂的逻辑,这肯定涉及到一个持久存储,所有的盒子都同步访问。当然,实现这种性能更难。

我能看到的最佳选择是有一个相当长的 ID,以便为这些部分留出空间:

  1. System.currentTimeMillis 用于长期唯一性(跨重启);
  2. System.nanotime 更细粒度;
  3. 每个服务器节点的唯一 ID(以特定于平台的方式确定)。

该方法仍然必须记住最后生成的值并在重复的情况下重试。不过,它不必重试太多次,直到下一个 nanoTime 时钟滴答——它甚至可以忙等待它。

没有第 3 点的代码草图(单节点实现):

private static long lastNanos;
public static synchronized String uniqueId() {
for (;/*ever*/;) {
final long n = System.nanoTime();
if (n == lastNanos) continue;
lastNanos = n;
return "" + System.currentTimeMillis() + n;
}
}

关于java - 如何在java中生成增量标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12911163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com