雪花算法(Snowflake
)是一种分布式唯一 ID 生成算法,能够生成唯一的、有序的、高可用的 ID,常用于分布式系统中作为全局唯一标识符(GUID)。雪花算法生成的 ID 是一个 64 位的整数,其中高位是时间戳,中间位是机器 ID,低位是序列号。
通常,分布式系统需要实现全局唯一的 ID 时,可以考虑使用雪花算法。以下是一些常见的业务场景:
总之,任何需要实现全局唯一的、有序递增的 ID 的业务场景,都可以考虑使用雪花算法来生成 ID。
雪花算法生成的 ID 是一个 64 位的整数,其中高位是时间戳,中间位是机器 ID,低位是序列号。使用雪花算法生成 ID 的步骤如下:
Snowflake
类,包含以下 3 个属性:Snowflake
类的 nextId()
方法,用来生成下一个 ID。该方法的具体实现如下:Copy code
public synchronized long nextId() {
// 获取当前时间戳
long timestamp = System.currentTimeMillis();
// 如果当前时间戳小于上次生成 ID 的时间戳,则说明系统时钟回退过,需要重新生成 ID
if (timestamp < lastTimestamp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id.");
}
// 如果当前时间戳和上次生成 ID 的时间戳相同,则在序列号上加 1
if (timestamp == lastTimestamp) {
sequence = (sequence + 1) & sequenceMask;
// 如果序列号超过了最大值,则需要等待到下一毫秒再生成 ID
if (sequence == 0) {
timestamp = tilNextMillis(lastTimestamp);
}
} else { // 如果当前时间戳大于上次生成 ID 的时间戳,则序列号重置为 0
sequence = 0;
}
// 更新上次生成 ID 的时间戳
lastTimestamp = timestamp;
// 生成 ID
long id = ((timestamp - twepoch) << timestampLeftShift) | (workerId << workerIdShift) | sequence;
return id;
}
Copy code
Snowflake snowflake = new Snowflake(0, 0);
long id = snowflake.nextId();
在上述代码中,创建了一个机器 ID 和序列号都为 0 的 Snowflake
实例,然后调用 nextId() 方法生成 ID。
需要注意的是,雪花算法的机器 ID 和序列号都需要进行配置,保证在不同的机器和同一毫秒内生成的 ID 不重复。另外,如果系统时钟回退,需要等待到下一毫秒再生成 ID,避免生成重复的 ID。