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

mybatis-plus雪花算法自動(dòng)生成機(jī)器id原理及源碼

 更新時(shí)間:2021年06月04日 11:51:53   作者:叁滴水  
Mybatis-Plus是一個(gè)Mybatis的增強(qiáng)工具,它在Mybatis的基礎(chǔ)上做了增強(qiáng),卻不做改變,Mybatis-Plus是為簡化開發(fā)、提高開發(fā)效率而生,但它也提供了一些很有意思的插件,比如SQL性能監(jiān)控、樂觀鎖、執(zhí)行分析等,下面一起看看mybatis-plus雪花算法自動(dòng)生成機(jī)器id原理解析

1、雪花算法原理

        雪花算法使用一個(gè) 64 bit 的 long 型的數(shù)字作為全局唯一 id。這 64 個(gè) bit 中,其中 1 個(gè) bit 是不用的,然后用其中的 41 bit 作為毫秒數(shù),用 10 bit 作為工作機(jī)器 id,12 bit 作為序列號(hào)。

img

  1. 1bit,不用,因?yàn)槎M(jìn)制中最高位是符號(hào)位,1表示負(fù)數(shù),0表示正數(shù)。生成的id一般都是用整數(shù),所以最高位固定為0。
  2. 41bit-時(shí)間戳,用來記錄時(shí)間戳,毫秒級(jí)。
  3. 10bit-工作機(jī)器id,用來記錄工作機(jī)器id。
  4. 12bit-序列號(hào),序列號(hào),用來記錄同毫秒內(nèi)產(chǎn)生的不同id。即可以用0、1、2、3、…4094這4095個(gè)數(shù)字,來表示同一機(jī)器同一時(shí)間截(毫秒)內(nèi)產(chǎn)生的4095個(gè)ID序號(hào)。

SnowFlake可以保證:

所有生成的id按時(shí)間趨勢遞增
整個(gè)分布式系統(tǒng)內(nèi)不會(huì)產(chǎn)生重復(fù)id(因?yàn)橛衐atacenterId和workerId來做區(qū)分)

        如上大概了解了雪花算法的原理,而且也知道機(jī)器號(hào)對(duì)于雪花算法的重要性。如果機(jī)器號(hào)一樣,可能會(huì)出現(xiàn)id重復(fù)的情況。

        mybatis-plus自3.3.0開始,默認(rèn)使用雪花算法+UUID(不含中劃線),但是它并沒有強(qiáng)制讓開發(fā)者配置機(jī)器號(hào)。這一點(diǎn)很是疑惑,這樣可能會(huì)讓不了解雪花算法的人埋下了一個(gè)坑。
        但是這么強(qiáng)大的一個(gè)框架難道真的沒有做優(yōu)化嗎?帶著問題,查看了下mybatis-plus雪花算法源碼com.baomidou.mybatisplus.core.toolkit.Sequence。最終發(fā)現(xiàn)在沒有設(shè)置機(jī)器號(hào)的情況下,會(huì)通過當(dāng)前物理網(wǎng)卡地址和jvm的進(jìn)程ID自動(dòng)生成。這真的是一個(gè)較好的解決方案。一般在一個(gè)集群中,MAC+JVM進(jìn)程PID一樣的幾率非常小。

2、自動(dòng)生成唯一機(jī)器號(hào)源碼

核心代碼。有兩個(gè)構(gòu)造方法,一個(gè)無參構(gòu)造,一個(gè)有參構(gòu)造。

public Sequence() {
    //通過當(dāng)前物理網(wǎng)卡地址獲取datacenterId
    this.datacenterId = getDatacenterId(maxDatacenterId);
    //物理網(wǎng)卡地址+jvm進(jìn)程pi獲取workerId
    this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);
}

/**
 * 有參構(gòu)造器
 *
 * @param workerId     工作機(jī)器 ID
 * @param datacenterId 序列號(hào)
 */
public Sequence(long workerId, long datacenterId) {
    Assert.isFalse(workerId > maxWorkerId || workerId < 0,
            String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
    Assert.isFalse(datacenterId > maxDatacenterId || datacenterId < 0,
            String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
    this.workerId = workerId;
    this.datacenterId = datacenterId;
}
  • 無參構(gòu)造 開發(fā)者沒有設(shè)置機(jī)器號(hào)時(shí)
  • 有參構(gòu)造 開發(fā)者自行設(shè)置機(jī)器號(hào)
protected static long getDatacenterId(long maxDatacenterId) {
    long id = 0L;
    try {
        //獲取本機(jī)(或者服務(wù)器ip地址)
        //DESKTOP-123SDAD/192.168.1.87
        InetAddress ip = InetAddress.getLocalHost();
        NetworkInterface network = NetworkInterface.getByInetAddress(ip);
        //一般不是null會(huì)進(jìn)入else
        if (network == null) {
            id = 1L;
        } else {
            //獲取物理網(wǎng)卡地址
            byte[] mac = network.getHardwareAddress();
            if (null != mac) {
                id = ((0x000000FF & (long) mac[mac.length - 2]) | (0x0000FF00 & (((long) mac[mac.length - 1]) << 8))) >> 6;
                id = id % (maxDatacenterId + 1);
            }
        }
    } catch (Exception e) {
        logger.warn(" getDatacenterId: " + e.getMessage());
    }
    return id;
}
/**
 * 獲取 maxWorkerId
 */
protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
    StringBuilder mpid = new StringBuilder();
    mpid.append(datacenterId);
    //獲取jvm進(jìn)程信息
    String name = ManagementFactory.getRuntimeMXBean().getName();
    if (StringUtils.isNotBlank(name)) {
        /*
         * 獲取進(jìn)程PID
         */
        mpid.append(name.split(StringPool.AT)[0]);
    }
    /*
     * MAC + PID 的 hashcode 獲取16個(gè)低位
     */
    return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
}

以上就是mybatis-plus雪花算法自動(dòng)生成機(jī)器id原理的詳細(xì)內(nèi)容,更多關(guān)于mybatis plus雪花id的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 簡單了解Mybatis如何實(shí)現(xiàn)SQL防注入

    簡單了解Mybatis如何實(shí)現(xiàn)SQL防注入

    這篇文章主要介紹了簡單了解Mybatis如何實(shí)現(xiàn)SQL防注入,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot Test類注入失敗的解決

    SpringBoot Test類注入失敗的解決

    這篇文章主要介紹了SpringBoot Test類注入失敗的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • IDEA啟動(dòng)Springboot報(bào)錯(cuò):無效的目標(biāo)發(fā)行版:17 的解決辦法

    IDEA啟動(dòng)Springboot報(bào)錯(cuò):無效的目標(biāo)發(fā)行版:17 的解決辦法

    這篇文章主要給大家介紹了IDEA啟動(dòng)Springboot報(bào)錯(cuò):無效的目標(biāo)發(fā)行版:17 的解決辦法,文中通過代碼示例和圖文講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 老生常談反射之Class類的使用(必看篇)

    老生常談反射之Class類的使用(必看篇)

    下面小編就為大家?guī)б黄仙U劮瓷渲瓹lass類的使用(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringBoot中動(dòng)態(tài)數(shù)據(jù)源配置與使用詳解

    SpringBoot中動(dòng)態(tài)數(shù)據(jù)源配置與使用詳解

    在現(xiàn)代應(yīng)用中,處理多數(shù)據(jù)源是常見的需求,在 Spring Boot 中,這樣的需求可以通過動(dòng)態(tài)數(shù)據(jù)源來輕松實(shí)現(xiàn),本篇博客將詳細(xì)介紹如何在 Spring Boot 中配置和使用動(dòng)態(tài)數(shù)據(jù)源,并演示如何切換到指定的數(shù)據(jù)源,需要的朋友可以參考下
    2024-10-10
  • Eclipse常用快捷鍵大全

    Eclipse常用快捷鍵大全

    這篇文章主要介紹了Eclipse常用快捷鍵大全,較為詳細(xì)的針對(duì)eclipse中各種應(yīng)用中使用快捷鍵進(jìn)行了分類總結(jié),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • 項(xiàng)目打包成jar后包無法讀取src/main/resources下文件的解決

    項(xiàng)目打包成jar后包無法讀取src/main/resources下文件的解決

    本文主要介紹了項(xiàng)目打包成jar后包無法讀取src/main/resources下文件的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Spring?@Conditional注解示例詳細(xì)講解

    Spring?@Conditional注解示例詳細(xì)講解

    @Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊(cè)bean,這篇文章主要介紹了Spring?@Conditional注解示例詳細(xì)講解,需要的朋友可以參考下
    2022-11-11
  • SpringBoot中進(jìn)行事務(wù)回滾的方法

    SpringBoot中進(jìn)行事務(wù)回滾的方法

    在Spring Boot中,可以使用TransactionTemplate或@Transactional注解來進(jìn)行事務(wù)管理,本文主要介紹了SpringBoot中進(jìn)行事務(wù)回滾的方法,感興趣的可以了解一下
    2023-11-11
  • 全面了解servlet中cookie的使用方法

    全面了解servlet中cookie的使用方法

    下面小編就為大家?guī)硪黄媪私鈙ervlet中cookie的使用方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06

最新評(píng)論

双城市| 郴州市| 鄱阳县| 乌兰浩特市| 错那县| 江源县| 东源县| 双柏县| 左权县| 利辛县| 日喀则市| 淮南市| 桑植县| 伊宁县| 开封县| 万山特区| 高清| 莆田市| 行唐县| 福安市| 衡南县| 中牟县| 安化县| 祁门县| 泰和县| 乐都县| 榕江县| 黄梅县| 大余县| 凤山市| 巴中市| 贵溪市| 静宁县| 安丘市| 芮城县| 邯郸县| 纳雍县| 民县| 建德市| 承德市| 兴业县|