国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

mybatis-plus雪花算法自動生成機器id原理及源碼

瀏覽:4日期:2023-10-19 10:44:29
目錄1、雪花算法原理2、自動生成唯一機器號源碼1、雪花算法原理

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

mybatis-plus雪花算法自動生成機器id原理及源碼

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

SnowFlake可以保證:

所有生成的id按時間趨勢遞增整個分布式系統(tǒng)內(nèi)不會產(chǎn)生重復(fù)id(因為有datacenterId和workerId來做區(qū)分)

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

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

2、自動生成唯一機器號源碼

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

public Sequence() { //通過當(dāng)前物理網(wǎng)卡地址獲取datacenterId this.datacenterId = getDatacenterId(maxDatacenterId); //物理網(wǎng)卡地址+jvm進程pi獲取workerId this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);}/** * 有參構(gòu)造器 * * @param workerId 工作機器 ID * @param datacenterId 序列號 */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è)置機器號時 有參構(gòu)造 開發(fā)者自行設(shè)置機器號

protected static long getDatacenterId(long maxDatacenterId) { long id = 0L; try {//獲取本機(或者服務(wù)器ip地址)//DESKTOP-123SDAD/192.168.1.87InetAddress ip = InetAddress.getLocalHost();NetworkInterface network = NetworkInterface.getByInetAddress(ip);//一般不是null會進入elseif (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進程信息 String name = ManagementFactory.getRuntimeMXBean().getName(); if (StringUtils.isNotBlank(name)) {/* * 獲取進程PID */mpid.append(name.split(StringPool.AT)[0]); } /* * MAC + PID 的 hashcode 獲取16個低位 */ return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);}

以上就是mybatis-plus雪花算法自動生成機器id原理的詳細內(nèi)容,更多關(guān)于mybatis plus雪花id的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 免费看成人播放毛片 | v片在线看 | 亚洲一区二区三区免费在线观看 | 日本高清免费视频色www | 高清毛片一区二区三区 | 亚洲欧美一区二区久久 | 日本免费一区二区三区a区 日本免费一区二区三区看片 | 草草影院www色欧美极品 | 国产亚洲高清在线精品不卡 | 欧美成人观看免费完全 | a级毛片免费高清视频 | 久久亚洲一级α片 | 成人手机视频在线观看 | 亚洲国产精品久久网午夜 | 黄色片亚洲 | 国产成人精品一区二三区2022 | 一级毛毛片毛片毛片毛片在线看 | 最新理论三级中文在线观看 | 亚洲国产日韩a在线亚洲 | 给我一个可以看片的www日本 | 久久久久久亚洲精品不卡 | 亚洲在成人网在线看 | 欧美视频在线观看 | 久久久9999久久精品小说 | 国产91久久最新观看地址 | 精品亚洲综合久久中文字幕 | 成人国产在线看不卡 | 国产三级日本三级日产三 | 黄色毛片视频在线观看 | 日韩国产一区二区 | 亚洲成年 | 玖玖玖精品视频免费播放 | 天天干夜夜玩 | 久久 精品 一区二区 | 搞黄网站免费观看 | 成年人网站在线 | 欧美日韩专区国产精品 | 国产精品免费一区二区三区 | 日本三级2021最新理论在线观看 | 在线观看中文字幕国产 | 91久久精品国产91久久性色也 |