Java 没有重复的序列生成
Java Sequence Generation without repetition
我有一个特定的要求,即为当天生成一个唯一的序列号。即使 JVM 重新启动,实用程序也应该能够生成序列而不重复。
先决条件:
- 不应使用数据库序列。
- 不应在文件系统中存储任何内容。
- 序列可以在一天中重复。
- 序列不应在一天内重复,即使 JVM 重新启动(这已通过不同的属性确保)。
- 每秒序列数最低要求为 99。
Sequence format: ######## (8 digits max)
注意:在不同的节点实例中这将是 运行,因此序列的第一位保留用于标识节点。
一个简单的 clock-based 解决方案可能如下所示:
static int seq(int nodeId) {
int val = nodeId * 100_000_000 + (int) (System.currentTimeMillis() % 100_000_000);
try {
Thread.sleep(1); // introduce delay to ensure the generated values are unique
} catch (InterruptedException e) {}
return val;
}
延迟可以额外随机化(最多 5 毫秒):
static Random random = new SecureRandom();
static int seq(int nodeId) {
int val = nodeId * 100_000_000 + (int) (System.currentTimeMillis() % 100_000_000);
try {
Thread.sleep(1 + random.nextInt(4));
} catch (InterruptedException e) {}
return val;
}
我有一个特定的要求,即为当天生成一个唯一的序列号。即使 JVM 重新启动,实用程序也应该能够生成序列而不重复。
先决条件:
- 不应使用数据库序列。
- 不应在文件系统中存储任何内容。
- 序列可以在一天中重复。
- 序列不应在一天内重复,即使 JVM 重新启动(这已通过不同的属性确保)。
- 每秒序列数最低要求为 99。
Sequence format: ######## (8 digits max)
注意:在不同的节点实例中这将是 运行,因此序列的第一位保留用于标识节点。
一个简单的 clock-based 解决方案可能如下所示:
static int seq(int nodeId) {
int val = nodeId * 100_000_000 + (int) (System.currentTimeMillis() % 100_000_000);
try {
Thread.sleep(1); // introduce delay to ensure the generated values are unique
} catch (InterruptedException e) {}
return val;
}
延迟可以额外随机化(最多 5 毫秒):
static Random random = new SecureRandom();
static int seq(int nodeId) {
int val = nodeId * 100_000_000 + (int) (System.currentTimeMillis() % 100_000_000);
try {
Thread.sleep(1 + random.nextInt(4));
} catch (InterruptedException e) {}
return val;
}