最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自定義雪花算法生成ID的實現(xiàn)示例

 更新時間:2025年04月25日 09:57:22   作者:灰_灰丶灰  
雪花算法是一種生成唯一ID的分布式算法,它能生成不重復的、有時間順序的全局唯一ID,本文主要介紹了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)。
  • 位移量:

    • workerIdShiftdatacenterIdShifttimestampLeftShift:用于將各部分數(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 plugin詳解

    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)代碼

    這篇文章主要介紹了Spring Security自定義認證器的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Java中常用隊列的使用解讀

    Java中常用隊列的使用解讀

    這篇文章主要介紹了Java中常用隊列的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • MyBatis快速入門

    MyBatis快速入門

    MyBatis是支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設置以及結果集的檢索。想要學好它,那就要從MyBatis基礎知識學起,下面跟著小編一起來看下吧
    2017-03-03
  • 深入探究Java中的類加載機制

    深入探究Java中的類加載機制

    這篇文章主要給大家介紹了關于Java中類加載機制的相關資料,JVM將類加載過程分為三個步驟:裝載(Load)、鏈接(Link)和初始化(Initialize),本文通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • Java多線程 BlockingQueue實現(xiàn)生產(chǎn)者消費者模型詳解

    Java多線程 BlockingQueue實現(xiàn)生產(chǎn)者消費者模型詳解

    這篇文章主要介紹了Java多線程 BlockingQueue實現(xiàn)生產(chǎn)者消費者模型詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • 在SpringBoot中配置和使用多個數(shù)據(jù)源方式

    在SpringBoot中配置和使用多個數(shù)據(jù)源方式

    本文介紹如何在Spring?Boot中配置多數(shù)據(jù)源,需通過配置類聲明不同數(shù)據(jù)源bean,使用@ConfigurationProperties映射屬性,并針對SpringDataJDBC和JPA分別配置JdbcTemplate與EntityManagerFactory,注意拆分包及@Primary注解的使用,同時可配置Hikari連接池
    2025-08-08
  • SpringBoot加載靜態(tài)資源的方式

    SpringBoot加載靜態(tài)資源的方式

    本篇文章主要介紹了SpringBoot加載靜態(tài)資源的方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • JAVA通過XPath解析XML性能比較詳解

    JAVA通過XPath解析XML性能比較詳解

    本篇文章主要介紹了JAVA通過XPath解析XML性能比較詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • springcloud注冊hostname或者ip的那些事

    springcloud注冊hostname或者ip的那些事

    Spring cloud是一個基于Spring Boot實現(xiàn)的服務治理工具包,在微服務架構中用于管理和協(xié)調(diào)服務的。這篇文章主要介紹了springcloud注冊hostname或者ip,需要的朋友可以參考下
    2019-11-11

最新評論

恩施市| 大姚县| 兴城市| 萝北县| 邳州市| 姜堰市| 涡阳县| 朝阳县| 红河县| 阿坝县| 平阳县| 开远市| 安福县| 静海县| 阜阳市| 阿克苏市| 井研县| 秭归县| 连平县| 铁力市| 元谋县| 甘孜| 高陵县| 绵竹市| 米林县| 扎赉特旗| 铜梁县| 张家川| 友谊县| 西丰县| 靖西县| 清流县| 梅河口市| 宜丰县| 阜城县| 五峰| 遵义县| 林州市| 集贤县| 鸡泽县| 凌云县|