詳解Java中雪花算法的實現

前言

本文主要介紹瞭Java雪花算法的實現

一、雪花算法

雪花算法是一種分佈式的id生成算法。原理是將long分成若幹個區段分別管理。默認包括時間戳、數據中心ID/機房ID,woker id(機器編號),以及sequence四個部分,用戶可以自由擴展第五個部分type。 同時用戶也可以動態調整這5個部分的占比關系。

二、使用步驟

1.引入庫

1.1 編譯並發佈到本地

gradle clean build publishToMavenLocal-x test

1.2 gradle (gradle.org)

implementation'io.github.kylin-hunter:k-commons:1.0.7'

1.3 maven (maven.apache.org)

        <dependency>
          <groupId>io.github.kylin-hunter</groupId>
            <artifactId>io.github.kylin-hunter:k-commons</artifactId>
          <version>1.0.7</version>
        </dependency>

2.示例

2.1 主要Api

2.1.1 構造器

   /**
 * @param type 業務類型
 * @param workerId 機器編號
 * @param datacenterId 機房編號
 * @title UidGenerator 構造器
 * @description
 * @author BiJi'an
 * @date 2022-12-11 16:19
 */
public UidGenerator(long type,long workerId,long datacenterId);
/**
 * @param sequenceBits  序列號 占的bit位數
 * @param typeBits 業務類型 占的bit位數
 * @param workerIdBits 機器編號 占的bit位數
 * @param datacenterIdBits 機房編號 占的bit位數
 * @param type 業務類型
 * @param workerId 機器編號
 * @param datacenterId 機房編號
 * @title UidGenerator 構造器
 * @description
 * @author BiJi'an
 * @date 2022-12-11 16:20
 */
public UidGenerator(int sequenceBits,int typeBits,int workerIdBits,int datacenterIdBits,        long type,long workerId,        long datacenterId);

2.1.2 生成和反解uid

 /**
 * @return long
 * @title 獲取下一個uid
 * @description
 * @author BiJi'an
 * @date 2022-12-11 00:39
 */
public synchronized long nextId();


/**
 * @param uid uid
 * @return io.github.kylinhunter.commons.uid.UidInfo
 * @title 通過uid 反解出uid的信息
 * @description
 * @author BiJi'an
 * @date 2022-12-11 16:30
 */
public UidInfo parse(long uid);

2.2代碼示例

    // 業務代碼 3,默認業務代碼支持范圍 0-15,可以通過構造器2調整支持范圍
    // 機器編碼 4,默認機器編碼支持范圍0-15,可以通過構造器2調整支持范圍
    // 機房編碼 1,默認機房支持范圍 0-4,可以通過構造器2調整支持范圍
    // 各個編碼范圍,均可以調整
        UidGenerator worker = new UidGenerator(3, 4, 1);
        for (int i = 0; i < 10; i++) {
          long nextId = worker.nextId();
          System.out.println(nextId + "=>" + worker.parse(nextId));
        }

2.3 結果輸出

        2022-12-11 22:54:26.177 [Test worker] INFO   –  i.g.k.commons.uid.UidGenerator[107]: timestampBits 41,datacenterIdBits 2, workerIdBits 4,typeBits 4, sequenceBits 12
        161155503589961728=>UidInfo[sequence=0, type=3, workerId=4, datacenterId=1, timestamp=1670921666180/2022-12-13 16:54:26]
        161155503644487680=>UidInfo[sequence=0, type=3, workerId=4, datacenterId=1, timestamp=1670921666193/2022-12-13 16:54:26]
        161155503648681984=>UidInfo[sequence=0, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681985=>UidInfo[sequence=1, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681986=>UidInfo[sequence=2, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681987=>UidInfo[sequence=3, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681988=>UidInfo[sequence=4, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681989=>UidInfo[sequence=5, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681990=>UidInfo[sequence=6, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681991=>UidInfo[sequence=7, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]

到此這篇關於詳解Java中雪花算法的實現的文章就介紹到這瞭,更多相關Java雪花算法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: