雪花ID生成器

一、什麼是雪花ID生成器

雪花ID生成器是一種分散式ID生成演算法,用於解決分散式系統中多節點,高並發下,生成唯一ID的問題。此演算法由Twitter公司開發,已經應用於很多互聯網公司的分散式系統中。雪花ID生成器的設計思想和目標是保證ID的全局唯一性和趨勢遞增,同時保證高性能,高可用性,和低延遲。

雪花演算法的結構如下:

    <---------------- 64位 ----------------->
    1位標識部分    41位時間戳部分          12位序列號部分 
    0              時間戳差值(ms)          自增序列號

雪花ID生成器主要包括三個部分:一個41位的時間戳,一個10位的工作機器ID,和一個12位的序列號。其中,時間戳部分的精度可以根據需求進行調整,序列號部分的初始值可以隨機調整,以適應不同場景下的需求。具體實現可以參考如下代碼:

public class SnowFlakeIdGenerator {
    private final long twepoch = 1288834974657L;
    private final long workerIdBits = 5L;
    private final long datacenterIdBits = 5L;
    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
    private final long sequenceBits = 12L;
    private final long workerIdShift = sequenceBits;
    private final long datacenterIdShift = sequenceBits + workerIdBits;
    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
    private final long sequenceMask = -1L ^ (-1L < maxWorkerId || workerId  maxDatacenterId || datacenterId < 0) {
            throw new IllegalArgumentException("datacenter Id can't be greater than " + maxDatacenterId + " or less than 0");
        }
        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }

    public synchronized long nextId() {
        long timestamp = timeGen();

        if (timestamp < lastTimestamp) {
            throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds");
        }

        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & sequenceMask;

            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0L;
        }

        lastTimestamp = timestamp;

        return ((timestamp - twepoch) << timestampLeftShift) |
                (datacenterId << datacenterIdShift) |
                (workerId << workerIdShift) |
                sequence;
    }

    private long tilNextMillis(long lastTimestamp) {
        long timestamp = timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = timeGen();
        }
        return timestamp;
    }

    private long timeGen() {
        return System.currentTimeMillis();
    }
}

二、雪花ID生成器的應用場景

雪花ID生成器可以應用於多種分散式系統中,如電商系統、社交網路、物聯網系統等,用於生成唯一ID和分配任務,具體應用場景包括:

1. 分散式系統中的ID生成

在分散式系統中,往往需要生成唯一ID,以便不同系統之間的數據交換和對賬。可以使用雪花ID生成器為每個系統分配唯一的ID,以便進行跨系統數據唯一性的保證。

2. 分散式任務調度

在分散式任務調度系統中,通常需要將任務分解成多個子任務,並將每個子任務分配給不同的節點進行處理。可以使用雪花ID生成器為每個子任務分配一個唯一的ID,以便追蹤任務的狀態和處理結果。

3. 分散式鎖

在分散式鎖中,需要使用唯一的ID來進行鎖的判定和釋放。可以使用雪花ID生成器為鎖分配唯一的ID。

三、雪花ID生成器的優缺點

1. 優點

1. 高並發、全局唯一:雪花ID生成器可以在高並發場景下,生成全局唯一ID,有效避免了ID重複的問題。

2. 趨勢遞增:雪花ID生成器生成的ID是趨勢遞增的,可以有效地提升索引性能。

3. 簡單易用:雪花ID生成器的實現簡單,易於使用和維護。

2. 缺點

1. 依賴於系統時鐘:雪花ID生成器依賴於系統時鐘,如果系統時鐘不穩定或時鐘回撥,會導致生成的ID重複。

2. 長整型數據長度:雪花ID生成器生成的ID為長整型數據,佔用8位元組的存儲空間。

3. 可能會導致序列號溢出:如果高並發下生成ID的速度足夠快,有可能導致序列號溢出的問題。

四、總結

總的來說,雪花ID生成器是一種簡單、高效、可靠的分散式ID生成演算法,已經被廣泛應用於各種分散式系統中。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/206798.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-08 14:17
下一篇 2024-12-08 14:17

相關推薦

  • 打造照片漫畫生成器的完整指南

    本文將分享如何使用Python編寫一個簡單的照片漫畫生成器,本文所提到的所有代碼和技術都適用於初學者。 一、環境準備 在開始編寫代碼之前,我們需要準備一些必要的環境。 首先,需要安…

    編程 2025-04-29
  • Python隨機數生成器

    Python隨機數生成器是一個常用的工具,它可以生成各種類型的隨機數,包括整數、浮點數和字元串等,廣泛用於模擬、遊戲、加密、測試等多個領域。本文將從多個方面對Python隨機數生成…

    編程 2025-04-28
  • 使用詞雲圖生成器網站,讓文字更美麗

    詞雲圖是一種非常實用的工具,通過它可以直觀地展示出文字內容的重點。而作為一個全能編程開發工程師,你一定需要掌握一些生成詞雲圖的技巧。這篇文章將從多個方面詳細闡述使用詞雲圖生成器網站…

    編程 2025-04-27
  • Python實現雪花飄落

    本文將介紹如何使用Python實現雪花飄落的效果。我們將從以下四個方面進行闡述:雪花的繪製、雪花的動畫、屏幕的刷新和主函數的編寫。 一、雪花的繪製 我們可以使用Python的tur…

    編程 2025-04-27
  • 如何實現一個隨機抽數生成器

    隨機數在程序開發中是非常常見的需求,而隨機抽數生成器則是其一大應用場景。在這篇文章中,我們將從多個方面來探討如何實現一個隨機抽數生成器,包括隨機數的概念、生成隨機數的方法、如何抽取…

    編程 2025-04-27
  • 資料庫unique id insert全面解析

    資料庫unique id insert是指在資料庫中插入唯一的ID,無論是在哪個場景下,這都是非常關鍵的一步。在本文中,我們將從不同角度對該問題進行詳細的闡述,並給出相應的代碼示例…

    編程 2025-04-25
  • Jquery獲取ID詳解

    一、從jQuery中獲取ID的值 在前端開發中,獲取DOM的id值是一個非常常見的操作,jQuery為我們提供了非常方便的方法,通過$(“#id”)獲取就可…

    編程 2025-04-25
  • 如何使用Spring Boot Banner生成器

    如果你經常使用Spring Boot,你可能已經知道應用程序啟動時,會顯示一個漂亮的Banner。這個Banner是由一個 banner.txt 文本文件自動生成的。在這篇文章中,…

    編程 2025-04-24
  • GUID生成器詳解

    一、GUID的定義與作用 GUID,全稱為全局唯一標識符(Globally Unique Identifier),是一種由演算法生成的標識號碼,在全局範圍內上沒有重複的可能性。GUI…

    編程 2025-04-24
  • 蘋果ID管理中心

    一、蘋果ID管理中心官網 蘋果ID管理中心是用來管理您的蘋果賬戶的網站。您可以在該網站上更改個人信息,了解最新的蘋果產品以及在頭像下拉框中查看所有蘋果產品。蘋果ID管理中心官網地址…

    編程 2025-04-23

發表回復

登錄後才能評論