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

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

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

IdGenerate

/**
 * 主鍵(id)生成器,用于生成唯一id號
 * 1、注意:在寫主鍵生成器時,請考慮主鍵不會重復(fù)。
 * 2、尤其需要考慮在短時間內(nèi)大量調(diào)用生成器,也保證不要出現(xiàn)重復(fù)
 * 3、實現(xiàn)類必須是線程安全的,因為會應(yīng)用在多線程環(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、機器碼在多臺機器或應(yīng)用間是不允許重復(fù)的!2、機器碼取值僅僅在0~31之間");
? ? ? ? }
? ? ? ? this.MACHINE_CODE = machineCode;
? ? ? ? orderNo = new AtomicInteger(0);
? ? }
? ? protected Long generateLong() {
? ? ? ? //1.與基準(zhǔn)時間對其,得到相對時間
? ? ? ? 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)文章

  • 淺析git server“丟失”commit問題

    淺析git server“丟失”commit問題

    這篇文章主要介紹了git server“丟失”commit問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • 解決IDEA克隆代碼后在右下角沒有g(shù)it分支的問題

    解決IDEA克隆代碼后在右下角沒有g(shù)it分支的問題

    這篇文章主要介紹了解決IDEA克隆代碼后在右下角沒有g(shù)it分支的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java學(xué)生管理系統(tǒng)界面簡單實現(xiàn)(全)

    java學(xué)生管理系統(tǒng)界面簡單實現(xiàn)(全)

    這篇文章主要為大家詳細(xì)介紹了java學(xué)生管理系統(tǒng)界面的簡單實現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(概要分析)

    Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(概要分析)

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 一個Servlet是如何處理多個請求的?

    一個Servlet是如何處理多個請求的?

    以前我一直以為一個Servlet只能處理一個請求,后來發(fā)現(xiàn)是自己太菜了,可以借助攜帶一個參數(shù)來完成多個請求的處理,根據(jù)參數(shù)的不同,在核心的service方法中調(diào)用不同的業(yè)務(wù)方法,來實現(xiàn)處理多個servlet請求的目的,廢話不多說,直接上代碼,需要的朋友可以參考下
    2021-06-06
  • Idea中使用Git實現(xiàn)方式

    Idea中使用Git實現(xiàn)方式

    本文總結(jié)了在Idea中配置Git、創(chuàng)建遠程倉庫、弱化了暫存區(qū)等內(nèi)容,詳細(xì)介紹了復(fù)制倉庫鏈接、創(chuàng)建本地倉庫、提交、查看提交記錄、推送、克隆、創(chuàng)建分支、切換、刪除、創(chuàng)建、重命名分支等操作
    2026-05-05
  • Java使用自定義注解實現(xiàn)為事件源綁定事件監(jiān)聽器操作示例

    Java使用自定義注解實現(xiàn)為事件源綁定事件監(jiān)聽器操作示例

    這篇文章主要介紹了Java使用自定義注解實現(xiàn)為事件源綁定事件監(jiān)聽器操作,結(jié)合實例形式分析了java自定義注解、注解處理、事件監(jiān)聽與響應(yīng)等相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • Spring實現(xiàn)方式、隔離級別與傳播機制全攻略

    Spring實現(xiàn)方式、隔離級別與傳播機制全攻略

    本文介紹了Spring事務(wù)的基礎(chǔ)概念、實現(xiàn)方式、核心注解配置、隔離級別和傳播機制,并通過實際場景詳細(xì)解析了事務(wù)傳播機制的7種行為,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • 如何在Spring Boot項目中使用Spring AI

    如何在Spring Boot項目中使用Spring AI

    Spring AI是Spring框架中用于集成和使用人工智能和機器學(xué)習(xí)功能的組件,它提供了一種簡化的方式來與AI模型進行交互,這篇文章主要介紹了Spring Boot 在項目中使用Spring AI,需要的朋友可以參考下
    2024-05-05
  • java實現(xiàn)簡單的學(xué)生信息管理系統(tǒng)代碼實例

    java實現(xiàn)簡單的學(xué)生信息管理系統(tǒng)代碼實例

    這篇文章主要介紹了java實現(xiàn)簡單的學(xué)生信息管理系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論

淮安市| 常德市| 大竹县| 河池市| 宝鸡市| 呼玛县| 康马县| 陵川县| 屯昌县| 周至县| 西吉县| 龙胜| 行唐县| 响水县| 桂东县| 麻城市| 西林县| 饶平县| 宕昌县| 马山县| 广德县| 营口市| 饶阳县| 会泽县| 新昌县| 偏关县| 左云县| 南岸区| 清远市| 淄博市| 凯里市| 德惠市| 郓城县| 柏乡县| 安福县| 合阳县| 孟连| 武宁县| 措美县| 永年县| 公安县|