Java序列生成,无需重复

问题描述

我有一个特殊要求,要为当天生成一个唯一的序列号。即使重新启动JVM,该实用程序也应能够生成序列而无需重复。

先决条件:

  • 不应使用数据库序列。
  • 不应在文件系统中存储任何内容
  • 序列可以全天重复。
  • 即使重新启动JVM,也不应该在一天之内重复序列(已经确保使用不同的属性)。
  • 每秒的序列号是最低要求99。

顺序格式:########(最多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;
}