问题描述
我有一个特殊要求,要为当天生成一个唯一的序列号。即使重新启动JVM,该实用程序也应能够生成序列而无需重复。
先决条件:
顺序格式:########(最多8位数字)
注意:它将在不同的节点实例中运行,因此保留了序列的前几位以标识节点。
解决方法
一个简单的基于时钟的解决方案可能看起来像这样:
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;
}