亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatis-plus雪花算法自動生成機器id原理的示例分析

發布時間:2021-06-04 14:54:29 來源:億速云 閱讀:475 作者:小新 欄目:開發技術

這篇文章主要介紹了mybatis-plus雪花算法自動生成機器id原理的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1、雪花算法原理

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

mybatis-plus雪花算法自動生成機器id原理的示例分析

  1. 1bit,不用,因為二進制中最高位是符號位,1表示負數,0表示正數。生成的id一般都是用整數,所以最高位固定為0。

  2. 41bit-時間戳,用來記錄時間戳,毫秒級。

  3. 10bit-工作機器id,用來記錄工作機器id。

  4. 12bit-序列號,序列號,用來記錄同毫秒內產生的不同id。即可以用0、1、2、3、…4094這4095個數字,來表示同一機器同一時間截(毫秒)內產生的4095個ID序號。

SnowFlake可以保證:

所有生成的id按時間趨勢遞增
整個分布式系統內不會產生重復id(因為有datacenterId和workerId來做區分)

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

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

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

核心代碼。有兩個構造方法,一個無參構造,一個有參構造。

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

/**
 * 有參構造器
 *
 * @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;
}
  • 無參構造 開發者沒有設置機器號時

  • 有參構造 開發者自行設置機器號

protected static long getDatacenterId(long maxDatacenterId) {
    long id = 0L;
    try {
        //獲取本機(或者服務器ip地址)
        //DESKTOP-123SDAD/192.168.1.87
        InetAddress ip = InetAddress.getLocalHost();
        NetworkInterface network = NetworkInterface.getByInetAddress(ip);
        //一般不是null會進入else
        if (network == null) {
            id = 1L;
        } else {
            //獲取物理網卡地址
            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原理的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

呼和浩特市| 武隆县| 察隅县| 平远县| 阿克陶县| 同江市| 子长县| 大理市| 嫩江县| 怀远县| 永济市| 西乌珠穆沁旗| 章丘市| 神木县| 凤台县| 饶平县| 平安县| 岱山县| 连城县| 双牌县| 泸溪县| 个旧市| 剑阁县| 砚山县| 资兴市| 克拉玛依市| 宝坻区| 黔西| 宣威市| 芒康县| 班戈县| 旬邑县| 甘孜县| 武冈市| 灯塔市| 康马县| 许昌县| 库尔勒市| 昆明市| 昌图县| 定安县|