国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

實(shí)現(xiàn)高性能ID生成器:詳解Java雪花算法

這篇具有很好參考價(jià)值的文章主要介紹了實(shí)現(xiàn)高性能ID生成器:詳解Java雪花算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Java中的雪花算法(Snowflake Algorithm)是一種用于生成唯一ID的算法,可以在分布式系統(tǒng)環(huán)境中防止ID重復(fù)。這種算法最初由Twitter開發(fā),用于生成Twitter的唯一ID,由于其簡(jiǎn)單易懂和高效,已成為目前最常用的生成唯一ID的算法之一。

雪花算法生成的ID是一個(gè)64位的長(zhǎng)整型數(shù)字,可以分為四個(gè)部分:

  1. 符號(hào)位(始終為0,占用1位)。
  2. 時(shí)間戳(毫秒級(jí),占用41位),可以用的年限約69年。
  3. 數(shù)據(jù)中心ID(可以定義具體數(shù)據(jù)中心ID的位數(shù),占用5位),用于區(qū)分不同的數(shù)據(jù)中心。
  4. 工作機(jī)器ID(可以定義具體工作機(jī)器ID的位數(shù),占用5位),用于區(qū)分不同的工作機(jī)器。

以下是Java實(shí)現(xiàn)的基本流程:

  1. 獲得時(shí)間戳,精確到毫秒級(jí)。
  2. 將所有位數(shù)的值全部初始化為0。
  3. 填充時(shí)間戳,對(duì)應(yīng)41位。
  4. 填充數(shù)據(jù)中心ID,根據(jù)自身需求設(shè)置位數(shù)。
  5. 填充工作機(jī)器ID,根據(jù)自身需求設(shè)置位數(shù)。
  6. 填充序列號(hào),一般使用一個(gè)計(jì)數(shù)器,生成一系列自增的整數(shù)。
  7. 將上述所有部分組合成一條64位的長(zhǎng)整型數(shù)字,即為唯一ID,生成完成。

以下是一個(gè)Java實(shí)現(xiàn)的示例代碼:

public class SnowFlake {

    // 起始的時(shí)間戳
    private final static long START_TIMESTAMP = 1480166465631L;

    // 每一部分占用的位數(shù),符號(hào)位不算在內(nèi)
    private final static long SEQUENCE_BIT = 12; // 序列號(hào)占用的位數(shù)
    private final static long MACHINE_BIT = 5; // 機(jī)器標(biāo)識(shí)占用的位數(shù)
    private final static long DATACENTER_BIT = 5; // 數(shù)據(jù)中心占用的位數(shù)

    // 每一部分的最大值
    private final static long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);
    private final static long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT);
    private final static long MAX_DATACENTER_NUM = ~(-1L << DATACENTER_BIT);

    // 每一部分向左的位移
    private final static long MACHINE_LEFT = SEQUENCE_BIT;
    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
    private final static long TIMESTAMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;

    private long datacenterId; // 數(shù)據(jù)中心
    private long machineId; // 機(jī)器標(biāo)識(shí)
    private long sequence = 0L; // 序列號(hào)
    private long lastTimestamp = -1L;// 上一次時(shí)間戳

    public SnowFlake(long datacenterId, long machineId) {
        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
            throw new IllegalArgumentException("Datacenter ID can't be greater than MAX_DATACENTER_NUM or less than 0");
        }
        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
            throw new IllegalArgumentException("Machine ID can't be greater than MAX_MACHINE_NUM or less than 0");
        }
        this.datacenterId = datacenterId;
        this.machineId = machineId;
    }

    /**
     * 產(chǎn)生下一個(gè)ID
     *
     * @return 下一個(gè)ID
     */
    public synchronized long nextId() {
        long currTimestamp = getTimestamp();
        if (currTimestamp < lastTimestamp) {
            throw new RuntimeException("Clock moved backwards. Refusing to generate id");
        }

        // 如果是同一時(shí)間生成的,則進(jìn)行毫秒內(nèi)序列
        if (currTimestamp == lastTimestamp) {
            sequence = (sequence + 1) & MAX_SEQUENCE;
            // 序列號(hào)已經(jīng)達(dá)到最大值,下一個(gè)毫秒
            if (sequence == 0L) {
                currTimestamp = getNextTimestamp();
            }
        } else {
            // 時(shí)間戳改變,毫秒內(nèi)序列重置
            sequence = 0L;
        }

        // 上次生成ID的時(shí)間截
        lastTimestamp = currTimestamp;

        // 移位并通過或運(yùn)算拼到一起組成64位的ID
        return (currTimestamp - START_TIMESTAMP) << TIMESTAMP_LEFT // 時(shí)間戳部分
                | datacenterId << DATACENTER_LEFT // 數(shù)據(jù)中心部分
                | machineId << MACHINE_LEFT // 機(jī)器標(biāo)識(shí)部分
                | sequence; // 序列號(hào)部分
    }

    /**
     * 獲取下一個(gè)毫秒數(shù)
     *
     * @return 下一個(gè)毫秒數(shù)
     */
    private long getNextTimestamp() {
        long timestamp = getTimestamp();
        while (timestamp <= lastTimestamp) {
            timestamp = getTimestamp();
        }
        return timestamp;
    }

    /**
     * 獲取當(dāng)前的時(shí)間戳
     *
     * @return 當(dāng)前的時(shí)間戳
     */
    private long getTimestamp() {
        return System.currentTimeMillis();
    }

    public static void main(String[] args) {
        SnowFlake snowFlake = new SnowFlake(1, 1);

        long startTime = System.nanoTime();

        for (int i = 0; i < 1000000; i++) {
            System.out.println(snowFlake.nextId());
        }

        long endTime = System.nanoTime();

        System.out.println("用時(shí):" + (endTime - startTime) / 1000000 + "ms");
    }
}

在以上示例代碼中,SnowFlake類的構(gòu)造函數(shù)接收數(shù)據(jù)中心ID和機(jī)器ID作為參數(shù),用戶可以根據(jù)自己的業(yè)務(wù)需求設(shè)置不同的數(shù)值。nextId()方法用于生成雪花算法的唯一ID。

除此之外,為了防止時(shí)間回退的情況,采用了getNextTimestamp()方法來獲得下一個(gè)合法的時(shí)間戳??梢钥吹剑@是一種高效、易擴(kuò)展、高可用的算法,適合于生成分布式系統(tǒng)下唯一的ID。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-426515.html

到了這里,關(guān)于實(shí)現(xiàn)高性能ID生成器:詳解Java雪花算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • zookeeper應(yīng)用場(chǎng)景之分布式的ID生成器

    zookeeper應(yīng)用場(chǎng)景之分布式的ID生成器

    ????????在分布式系統(tǒng)中, 分布式ID生成器的使用場(chǎng)景非常之多 : 大量的數(shù)據(jù)記錄,需要分布式ID。 大量的系統(tǒng)消息,需要分布式ID。 大量的請(qǐng)求日志,如restful的操作記錄,需要唯一標(biāo)識(shí),以便進(jìn)行后續(xù)的用戶行為分析和調(diào)用鏈路分析。 分布式節(jié)點(diǎn)的命名服務(wù),往往也

    2024年01月23日
    瀏覽(33)
  • 【Spring Boot 3】【Redis】分布式唯一ID生成器

    軟件開發(fā)是一門實(shí)踐性科學(xué),對(duì)大多數(shù)人來說,學(xué)習(xí)一種新技術(shù)不是一開始就去深究其原理,而是先從做出一個(gè)可工作的DEMO入手。但在我個(gè)人學(xué)習(xí)和工作經(jīng)歷中,每次學(xué)習(xí)新技術(shù)總是要花費(fèi)或多或少的時(shí)間、檢索不止一篇資料才能得出一個(gè)可工作的DEMO,這占用了我大量的時(shí)

    2024年01月20日
    瀏覽(21)
  • 對(duì)于現(xiàn)有的分布式id發(fā)號(hào)器的思考 id生成器 雪花算法 uuid

    目錄 雪花id tinyid uuid 分布式id特點(diǎn) 業(yè)務(wù)編號(hào) 數(shù)據(jù)中心編號(hào) 當(dāng)前時(shí)間 ip地址 當(dāng)前序號(hào) 對(duì)于時(shí)鐘回?fù)軉栴} 發(fā)號(hào)器機(jī)器當(dāng)期時(shí)間小于redis的時(shí)間 解決步驟 發(fā)號(hào)器機(jī)器當(dāng)期時(shí)間等于redis時(shí)間 發(fā)號(hào)器機(jī)器當(dāng)期時(shí)間大于redis最大的時(shí)間(相關(guān)的key不存在) 分布式id的單次獲取和批次獲

    2024年02月13日
    瀏覽(17)
  • 一文讀懂Stable Diffusion教程,搭載高性能PC集群,實(shí)現(xiàn)生成式AI應(yīng)用

    圖生圖 | PC集群 | PC Farm | Stable 文生圖 | 生成式AI | Stable Diffusion 在當(dāng)今計(jì)算領(lǐng)域中,PC集群和Stable Diffusion技術(shù)的應(yīng)用已經(jīng)成為不可或缺的一部分。這些技術(shù)在深度學(xué)習(xí)、AI繪畫、高性能計(jì)算、人工智能、大數(shù)據(jù)、ChatGPT、AIGC等領(lǐng)域中都具有重要的應(yīng)用價(jià)值。特別是在AI生成式內(nèi)

    2024年02月10日
    瀏覽(25)
  • 開箱即用輕量級(jí)雪花算法id生成器Java工具類

    在 Java后端研發(fā)過程中,對(duì)于分布式微服務(wù)來說,一般需要分布式 id生成. 這里分享一個(gè)非常好用且大多數(shù)情況下都可用的開箱即用輕量級(jí)雪花算法id生成器Java工具類。 這種方式生成的雪花算法生成器生成的唯一主鍵id,好處是不依賴第三方組件,輕量級(jí),缺點(diǎn)是服務(wù)器的時(shí)鐘

    2024年02月07日
    瀏覽(20)
  • Python中的迭代器與生成器提高性能的秘密武器【第143篇—迭代器與生成器】

    Python中的迭代器與生成器提高性能的秘密武器【第143篇—迭代器與生成器】

    前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家?!军c(diǎn)擊進(jìn)入巨牛的人工智能學(xué)習(xí)網(wǎng)站】。 在Python編程中,迭代器和生成器是提高性能和減少內(nèi)存消耗的重要工具。它們不僅簡(jiǎn)化了代碼結(jié)構(gòu),而且在處理大型數(shù)據(jù)集時(shí)具有明顯的優(yōu)勢(shì)

    2024年03月24日
    瀏覽(27)
  • 高性能渲染——詳解Html Canvas的優(yōu)勢(shì)與性能

    高性能渲染——詳解Html Canvas的優(yōu)勢(shì)與性能

    本文由葡萄城技術(shù)團(tuán)隊(duì)原創(chuàng)并首發(fā)。轉(zhuǎn)載請(qǐng)注明出處:葡萄城官網(wǎng),葡萄城為開發(fā)者提供專業(yè)的開發(fā)工具、解決方案和服務(wù),賦能開發(fā)者。 一、什么是Canvas 想必學(xué)習(xí)前端的同學(xué)們對(duì)Canvas 都不陌生,它是 HTML5 新增的“畫布”元素,可以使用JavaScript來繪制圖形。 Canvas元素是在

    2024年02月06日
    瀏覽(23)
  • Python asyncio高性能異步編程 詳解

    Python asyncio高性能異步編程 詳解

    目錄 一、協(xié)程 1.1、greenlet實(shí)現(xiàn)協(xié)程 1.2、yield 1.3、asyncio 1.4、async await 二、協(xié)程意義 三、異步編程 3.1、事件循環(huán) 3.2、快速上手 3.3、await 3.4、Task對(duì)象 3.5、asyncio.Future對(duì)象 3.5、concurrent.futures.Future對(duì)象 3.7、異步迭代器 3.8、異步上下文管理器 四、uvloop 五、實(shí)戰(zhàn)案例

    2024年02月20日
    瀏覽(33)
  • 詳解Python中的排列組合生成器

    在實(shí)際的開發(fā)場(chǎng)景中,經(jīng)常需要遍歷多個(gè)數(shù)組中的元素,將它們組合在一起使用。要取完所有可能的組合,最基本的方法是使用嵌套的循環(huán),有多少個(gè)數(shù)組就嵌套多少層循環(huán)。嵌套循環(huán)是基本的原理,但不夠簡(jiǎn)潔,Python中有更優(yōu)雅的方式來實(shí)現(xiàn)這種功能。 在Python的內(nèi)置模塊

    2024年02月10日
    瀏覽(26)
  • 【沐風(fēng)老師】3DMAX宇宙生成器(一鍵生成星系)插件使用方法詳解

    【沐風(fēng)老師】3DMAX宇宙生成器(一鍵生成星系)插件使用方法詳解

    3DMAX宇宙生成器(一鍵生成星系)插件 ?3DMAX宇宙生成器(一鍵生成星系)插件,用于模擬星團(tuán)及星系的運(yùn)動(dòng)??梢詣?chuàng)建單個(gè)集合進(jìn)行動(dòng)畫計(jì)算,也可以輸入不同坐標(biāo),建立多個(gè)集合后統(tǒng)一進(jìn)行動(dòng)畫計(jì)算。 【安裝方法】 無需安裝,使用時(shí)直接拖動(dòng)插件文件到3dMax視口打開即可

    2024年02月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包