欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2025年04月25日 09:57:22   作者:灰_灰丶灰  
雪花算法是一種生成唯一ID的分布式算法,它能生成不重復(fù)的、有時(shí)間順序的全局唯一ID,本文主要介紹了SpringBoot自定義雪花算法生成ID的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下

雪花算法(Snowflake)是一種生成唯一ID的分布式算法,由Twitter推出。它能生成不重復(fù)的、有時(shí)間順序的全局唯一ID。一個(gè)典型的Snowflake ID由64位組成,通常劃分如下:

  • 1位符號(hào)位(始終為0,表示正數(shù))
  • 41位時(shí)間戳(毫秒級(jí),表示當(dāng)前時(shí)間相對(duì)于某個(gè)開(kāi)始時(shí)間的偏移)
  • 10位機(jī)器標(biāo)識(shí)(通常分為數(shù)據(jù)中心ID和機(jī)器ID)
  • 12位序列號(hào)(表示毫秒內(nèi)的計(jì)數(shù)器)

下面是一個(gè)自定義的雪花算法來(lái)生成唯一的ID。這個(gè)實(shí)現(xiàn)類似于Twitter的Snowflake算法,并考慮到了線程安全。

public class SnowflakeIDGenerator {

    // 起始時(shí)間戳(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());
        }
    }
}

說(shuō)明

  • 初始化參數(shù):

    • twepoch:自定義的起始時(shí)間戳(可以是任意過(guò)去的時(shí)間),確保生成的ID是唯一且有序的。
    • workerIdBits 和 datacenterIdBits:分別表示工作節(jié)點(diǎn)ID和數(shù)據(jù)中心ID的位數(shù)(通常為5位)。
    • sequenceBits:表示序列號(hào)的位數(shù)(通常為12位)。
  • 最大值計(jì)算:

    • maxWorkerId 和 maxDatacenterId:根據(jù)位數(shù)計(jì)算出的最大值,確保ID在合理范圍內(nèi)。
  • 位移量:

    • workerIdShiftdatacenterIdShifttimestampLeftShift:用于將各部分?jǐn)?shù)據(jù)移到正確的位置。
  • 掩碼:

    • sequenceMask:確保序列號(hào)在0到4095之間循環(huán)。
  • 方法:

    • nextId:生成唯一ID,使用同步塊確保線程安全。
    • tilNextMillis:等待直到下一毫秒。
    • timeGen:獲取當(dāng)前時(shí)間戳。

使用示例

運(yùn)行上述代碼,你會(huì)看到生成的唯一ID,它們是按時(shí)間順序遞增的,每個(gè)ID包含了時(shí)間戳、數(shù)據(jù)中心ID、工作節(jié)點(diǎn)ID和序列號(hào)的信息。

到此這篇關(guān)于SpringBoot自定義雪花算法生成ID的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot 雪花算法生成ID內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring boot 配置多個(gè)redis的方法示例

    Spring boot 配置多個(gè)redis的方法示例

    這篇文章主要介紹了Spring boot 配置多個(gè)redis的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • SpringBoot起步依賴和自動(dòng)配置基本介紹

    SpringBoot起步依賴和自動(dòng)配置基本介紹

    這篇文章主要介紹了SpringBoot起步依賴和自動(dòng)配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 全面解釋java中StringBuilder、StringBuffer、String類之間的關(guān)系

    全面解釋java中StringBuilder、StringBuffer、String類之間的關(guān)系

    String的值是不可變的,這就導(dǎo)致每次對(duì)String的操作都會(huì)生成新的String對(duì)象,不僅效率低下,而且大量浪費(fèi)有限的內(nèi)存空間,StringBuffer是可變類,和線程安全的字符串操作類,任何對(duì)它指向的字符串的操作都不會(huì)產(chǎn)生新的對(duì)象,StringBuffer和StringBuilder類功能基本相似
    2013-01-01
  • IDEA編譯時(shí)報(bào)常量字符串過(guò)長(zhǎng)的解決辦法

    IDEA編譯時(shí)報(bào)常量字符串過(guò)長(zhǎng)的解決辦法

    本文主要介紹了IDEA編譯時(shí)報(bào)常量字符串過(guò)長(zhǎng)的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • java基于C/S模式實(shí)現(xiàn)聊天程序(服務(wù)器)

    java基于C/S模式實(shí)現(xiàn)聊天程序(服務(wù)器)

    這篇文章主要為大家詳細(xì)介紹了java基于C/S模式實(shí)現(xiàn)聊天程序的服務(wù)器篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 使用Spring注入Hibernate驗(yàn)證框架

    使用Spring注入Hibernate驗(yàn)證框架

    這篇文章主要介紹了使用Spring注入Hibernate驗(yàn)證框架方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳細(xì)介紹Java后端API接口開(kāi)發(fā)規(guī)范

    詳細(xì)介紹Java后端API接口開(kāi)發(fā)規(guī)范

    在Java后端開(kāi)發(fā)中,API接口的設(shè)計(jì)與開(kāi)發(fā)至關(guān)重要,本文詳細(xì)介紹了命名規(guī)范、接收參數(shù)規(guī)范、參數(shù)檢驗(yàn)、接收方式規(guī)范、異常類處理、統(tǒng)一返回格式以及冪等性等方面的開(kāi)發(fā)規(guī)范,提供了實(shí)際代碼示例,需要的朋友可以參考下
    2024-10-10
  • Java后端請(qǐng)求接收多個(gè)對(duì)象入?yún)⒌臄?shù)據(jù)方法(推薦)

    Java后端請(qǐng)求接收多個(gè)對(duì)象入?yún)⒌臄?shù)據(jù)方法(推薦)

    本文介紹了如何使用SpringBoot框架接收多個(gè)對(duì)象作為HTTP請(qǐng)求的入?yún)?通過(guò)創(chuàng)建數(shù)據(jù)模型、DTO類和Controller,我們可以輕松處理復(fù)雜的請(qǐng)求數(shù)據(jù)
    2024-11-11
  • 最新評(píng)論