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

java實現(xiàn)雪花算法ID生成器工具類

 更新時間:2023年07月14日 08:33:34   作者:喜羊羊sk  
本文主要介紹了java實現(xiàn)雪花算法ID生成器工具類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

IdGenerate

/**
 * 主鍵(id)生成器,用于生成唯一id號
 * 1、注意:在寫主鍵生成器時,請考慮主鍵不會重復。
 * 2、尤其需要考慮在短時間內(nèi)大量調(diào)用生成器,也保證不要出現(xiàn)重復
 * 3、實現(xiàn)類必須是線程安全的,因為會應用在多線程環(huán)境中去
 *
 */
@FunctionalInterface
public interface IdGenerate<T extends Serializable> {
    /**
     * id 生成器
     *
     * @return
     */
    T generate();
}

AbstractIdGenerate

/**
?* 抽象 ID 生成器
?*
?*/
public abstract class AbstractIdGenerate<T extends Serializable> implements IdGenerate<T> {
? ? private final static int MAX_MACHINE_CODE = 31;
? ? /**
? ? ?* 最大17bit的序列號是131071
? ? ?*/
? ? private final static int MAX_ORDER_NO = 131071;
? ? /**
? ? ?* 時間戳的掩碼41bit
? ? ?*/
? ? private final static long TIME_CODE = Long.MAX_VALUE >>> 22;
? ? /**
? ? ?* 2015-01-01 00:00:00
? ? ?* 1420041600210
? ? ?* 因為生成器可以使用69年,而我們想在這些時間里面,生成出來的id是逐漸自增的。
? ? ?* 所以這里指定了從什么時候開始使用id生成器。
? ? ?*/
? ? private final static long START_TIME = 1420041600210L;
? ? /**
? ? ?* 機器碼 (0-31)
? ? ?*/
? ? private final long MACHINE_CODE;
? ? /**
? ? ?* 用于生成序列號
? ? ?*/
? ? private AtomicInteger orderNo;
? ? public AbstractIdGenerate(final long machineCode) {
? ? ? ? if (machineCode < 0 || machineCode > MAX_MACHINE_CODE) {
? ? ? ? ? ? throw new IllegalArgumentException("請注意,1、機器碼在多臺機器或應用間是不允許重復的!2、機器碼取值僅僅在0~31之間");
? ? ? ? }
? ? ? ? this.MACHINE_CODE = machineCode;
? ? ? ? orderNo = new AtomicInteger(0);
? ? }
? ? protected Long generateLong() {
? ? ? ? //1.與基準時間對其,得到相對時間
? ? ? ? long currentTimeMillis = System.currentTimeMillis() - START_TIME;
? ? ? ? //2.保留相對時間的低41bit
? ? ? ? currentTimeMillis = currentTimeMillis & TIME_CODE;
? ? ? ? //3、將1到41bit移到高位去 就是23~63。
? ? ? ? currentTimeMillis = currentTimeMillis << 22;
? ? ? ? /*
? ? ? ? ?* 序列號自增1和獲取
? ? ? ? ?* 注意:先增加再取值。
? ? ? ? ?*/
? ? ? ? int orderNo = this.orderNo.incrementAndGet();
? ? ? ? do {
? ? ? ? ? ? if (orderNo > MAX_ORDER_NO) {
? ? ? ? ? ? ? ? //如果超過了最大序列號 ? 則重置為0
? ? ? ? ? ? ? ? if (this.orderNo.compareAndSet(orderNo, 0)) {
? ? ? ? ? ? ? ? ? ? //這里使用cas操作,所以不需要加鎖 ? ?1、操作失敗了 ? 則表示別的線程已經(jīng)更改了數(shù)據(jù),則直接進行自增并獲取則可以了
? ? ? ? ? ? ? ? ? ? orderNo = 0;
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? //注意:先增加再取值。
? ? ? ? ? ? ? ? ? ? orderNo = this.orderNo.incrementAndGet();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? } while (orderNo > MAX_ORDER_NO);
? ? ? ? //符號位(1)bit、時間戳(2~42)bit | 序列號(43~59)bit | 機器碼(60~64)bit
? ? ? ? return currentTimeMillis | (orderNo << 5) | MACHINE_CODE;
? ? }
}

SnowflakeIdGenerate

/**
?* 1bit ?? ??? ?+ 41bit ?? ??? ?+ 17bit ?? ??? ?+ 5bit
?* |?? ??? ??? ? ? ?|?? ??? ??? ??? ?|?? ??? ??? ??? ?|
?* |?? ??? ??? ??? ?|?? ??? ??? ??? ?|?? ??? ??? ??? ?|
?* 符合位 ? ? ?? ? ? ? ? ?時間戳(毫秒)?? ??? ? ? ? 序列號?? ??? ??? ? ? ? ?機器碼
?* 第1bit固定是0 ?符號位不動 。
?* 第2bit到第42bit使用時間蹉,精確到毫秒 ?41bit。 使用年限是69年
?* 第43bit到第59bit使用自增的序列號 ? ? ? 17bit ?可用序列號最大131071個,說明一毫秒我們可以生成131071個不同的序列號。
?* 第60bit到第64bit使用機器碼?? ?5bit ? 可以使系統(tǒng)可以分布式,最大分布式數(shù)量是32臺機子。
?*
?*/
public class SnowflakeIdGenerate extends AbstractIdGenerate<Long> {
? ? public SnowflakeIdGenerate(final long machineCode) {
? ? ? ? super(machineCode);
? ? }
? ? @Override
? ? public Long generate() {
? ? ? ? return super.generateLong();
? ? }
}

自動配置Bean

可以通過配置bean添加到容器,注入使用

/**
? * id生成 機器碼, 單機配置1即可。 集群部署,每個實例自增1即可。
? *
? * @param machineCode
? * @return
? */
?@Bean("snowflakeIdGenerate")
?public IdGenerate getIdGenerate(@Value("${id-generator.machine-code:1}") Long machineCode) {
? ? ?return new SnowflakeIdGenerate(machineCode);
?}

到此這篇關(guān)于java實現(xiàn)雪花算法ID生成器工具類的文章就介紹到這了,更多相關(guān)java雪花算法ID生成工具類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java編程多線程并發(fā)處理實例解析

    java編程多線程并發(fā)處理實例解析

    這篇文章主要介紹了java編程多線程并發(fā)處理實例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • SpringBoot http請求注解@RestController原理解析

    SpringBoot http請求注解@RestController原理解析

    這篇文章主要介紹了SpringBoot http請求注解@RestController原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Java構(gòu)造器使用方法及注意事項

    Java構(gòu)造器使用方法及注意事項

    這篇文章主要介紹了Java構(gòu)造器使用方法及注意事項的相關(guān)資料,這里舉例說明如何使用構(gòu)造器及需要注意的地方,需要的朋友可以參考下
    2017-07-07
  • JAVA實現(xiàn)下載文件功能的兩種方法

    JAVA實現(xiàn)下載文件功能的兩種方法

    這篇文章主要介紹了JAVA實現(xiàn)下載文件功能的兩種方法,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • java10下編譯lombok注解代碼分享

    java10下編譯lombok注解代碼分享

    這篇文章給大家分享了java10下編譯lombok注解的代碼,有興趣的朋友可以測試以下,學習參考下吧。
    2018-04-04
  • Java判斷中英文符號、標點的實現(xiàn)

    Java判斷中英文符號、標點的實現(xiàn)

    本篇文章主要介紹了Java判斷中英文符號、標點的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Maven的porfile與SpringBoot的profile結(jié)合使用案例詳解

    Maven的porfile與SpringBoot的profile結(jié)合使用案例詳解

    這篇文章主要介紹了Maven的porfile與SpringBoot的profile結(jié)合使用,通過maven的profile功能,在打包的時候,通過-P指定maven激活某個pofile,這個profile里面配置了一個參數(shù)activatedProperties,不同的profile里面的這個參數(shù)的值不同,需要的朋友可以參考下吧
    2021-12-12
  • springboot自定義攔截器簡單使用及舉例

    springboot自定義攔截器簡單使用及舉例

    Spring Boot攔截器是AOP的一種實現(xiàn),專門攔截對控制層的請求,主要應用于判斷用戶權(quán)限,攔截webSocket請求,下面這篇文章主要給大家介紹了關(guān)于springboot自定義攔截器簡單使用及舉例的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • SpringBoot利用dag加速Spring beans初始化的方法示例

    SpringBoot利用dag加速Spring beans初始化的方法示例

    本文介紹了利用DAG加速SpringBoot中Spring beans初始化,先解釋了DAG 概念及特性,包括節(jié)點入度出度、拓撲排序等,接著闡述加速Spring Bean初始化的實現(xiàn)思路,如識別依賴關(guān)系構(gòu)建DAG、拓撲排序、并行初始化Bean及與Spring集成,還展示了相關(guān)代碼工程、測試結(jié)果及引用
    2024-12-12
  • 淺談Java文件執(zhí)行順序、main程序入口的理解

    淺談Java文件執(zhí)行順序、main程序入口的理解

    這篇文章主要介紹了Java文件執(zhí)行順序、main程序入口的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03

最新評論