SpringBoot自定義雪花算法生成ID的實現(xiàn)示例
雪花算法(Snowflake)是一種生成唯一ID的分布式算法,由Twitter推出。它能生成不重復的、有時間順序的全局唯一ID。一個典型的Snowflake ID由64位組成,通常劃分如下:
- 1位符號位(始終為0,表示正數(shù))
- 41位時間戳(毫秒級,表示當前時間相對于某個開始時間的偏移)
- 10位機器標識(通常分為數(shù)據(jù)中心ID和機器ID)
- 12位序列號(表示毫秒內(nèi)的計數(shù)器)
下面是一個自定義的雪花算法來生成唯一的ID。這個實現(xiàn)類似于Twitter的Snowflake算法,并考慮到了線程安全。
public class SnowflakeIDGenerator {
// 起始時間戳(2020-01-01 00:00:00)
private final long twepoch = 1577836800000L;
// 每部分占用的位數(shù)
private final long workerIdBits = 5L;
private final long datacenterIdBits = 5L;
private final long sequenceBits = 12L;
// 最大值
private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
// 位移
private final long workerIdShift = sequenceBits;
private final long datacenterIdShift = sequenceBits + workerIdBits;
private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
// 掩碼
private final long sequenceMask = -1L ^ (-1L << sequenceBits);
private long workerId;
private long datacenterId;
private long sequence = 0L;
private long lastTimestamp = -1L;
public SnowflakeIDGenerator(long workerId, long datacenterId) {
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
}
if (datacenterId > maxDatacenterId || datacenterId < 0) {
throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
}
this.workerId = workerId;
this.datacenterId = datacenterId;
}
public synchronized long nextId() {
long timestamp = timeGen();
if (timestamp < lastTimestamp) {
throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
if (lastTimestamp == timestamp) {
sequence = (sequence + 1) & sequenceMask;
if (sequence == 0) {
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = timestamp;
return ((timestamp - twepoch) << timestampLeftShift)
| (datacenterId << datacenterIdShift)
| (workerId << workerIdShift)
| sequence;
}
protected long tilNextMillis(long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}
protected long timeGen() {
return System.currentTimeMillis();
}
public static void main(String[] args) {
SnowflakeIDGenerator generator = new SnowflakeIDGenerator(1, 1);
for (int i = 0; i < 10; i++) {
System.out.println(generator.nextId());
}
}
}
說明
初始化參數(shù):
twepoch:自定義的起始時間戳(可以是任意過去的時間),確保生成的ID是唯一且有序的。workerIdBits和datacenterIdBits:分別表示工作節(jié)點ID和數(shù)據(jù)中心ID的位數(shù)(通常為5位)。sequenceBits:表示序列號的位數(shù)(通常為12位)。
最大值計算:
maxWorkerId和maxDatacenterId:根據(jù)位數(shù)計算出的最大值,確保ID在合理范圍內(nèi)。
位移量:
workerIdShift,datacenterIdShift,timestampLeftShift:用于將各部分數(shù)據(jù)移到正確的位置。
掩碼:
sequenceMask:確保序列號在0到4095之間循環(huán)。
方法:
nextId:生成唯一ID,使用同步塊確保線程安全。tilNextMillis:等待直到下一毫秒。timeGen:獲取當前時間戳。
使用示例
運行上述代碼,你會看到生成的唯一ID,它們是按時間順序遞增的,每個ID包含了時間戳、數(shù)據(jù)中心ID、工作節(jié)點ID和序列號的信息。
到此這篇關于SpringBoot自定義雪花算法生成ID的實現(xiàn)示例的文章就介紹到這了,更多相關SpringBoot 雪花算法生成ID內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot的Maven插件Spring Boot Maven plu
Spring Boot的Maven插件Spring Boot Maven plugin以Maven的方式提供Spring Boot支持,Spring Boot Maven plugin將Spring Boot應用打包為可執(zhí)行的jar或war文件,然后以通常的方式運行Spring Boot應用,本文介紹Spring Boot的Maven插件Spring Boot Maven plugin,一起看看吧2024-01-01
Spring Security自定義認證器的實現(xiàn)代碼
這篇文章主要介紹了Spring Security自定義認證器的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
Java多線程 BlockingQueue實現(xiàn)生產(chǎn)者消費者模型詳解
這篇文章主要介紹了Java多線程 BlockingQueue實現(xiàn)生產(chǎn)者消費者模型詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09
在SpringBoot中配置和使用多個數(shù)據(jù)源方式
本文介紹如何在Spring?Boot中配置多數(shù)據(jù)源,需通過配置類聲明不同數(shù)據(jù)源bean,使用@ConfigurationProperties映射屬性,并針對SpringDataJDBC和JPA分別配置JdbcTemplate與EntityManagerFactory,注意拆分包及@Primary注解的使用,同時可配置Hikari連接池2025-08-08

