LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

分布式ID生成方式及技術實現(以C#為例)

admin
2024年7月8日 12:43 本文熱度 977

在分布式系統中,生成全局唯一的ID是一個核心問題。這不僅關系到數據的唯一性,還直接影響到系統的性能和擴展性。本文將介紹幾種常見的分布式ID生成方式,并通過C#示例代碼展示其中一種實現方式——Snowflake算法。

分布式ID生成方式概述

1. UUID

UUID(Universally Unique Identifier)是一種通過一系列算法生成的128位數字,通常基于時間戳、計算機硬件標識符、隨機數等元素。UUID的優點是實現簡單,無需網絡交互,保證了ID的全球唯一性。但其缺點也很明顯,如ID較長(36個字符的字符串形式),可能導致存儲和索引效率低下,且通常不能保證順序性。

2. 數據庫自增ID

基于數據庫的auto_increment自增ID也可以生成分布式ID。其優點是實現簡單,ID單調自增,數值類型查詢速度快。然而,在高并發場景下,單點數據庫會成為性能瓶頸,且存在單點故障風險。

3. Redis生成ID

Redis是一個高性能的鍵值數據庫,通過其原子性的INCR和INCRBY命令可以生成唯一的遞增數值。Redis的高性能保證了即使在高負載下也能快速生成ID,但高度依賴網絡,且需要額外的基礎設施管理和維護。

4. 雪花算法(Snowflake)

雪花算法是Twitter開源的一種分布式ID生成算法,生成的是一個64位的長整型數字。該算法通過組合時間戳、數據中心ID、機器ID和序列號來確保ID的全局唯一性和趨勢遞增。Snowflake算法不依賴于數據庫,適合分布式環境,且生成ID的性能高。

Snowflake算法詳解及C#實現

Snowflake算法組成

Snowflake生成的ID由以下幾部分組成:

  • 第1位:未使用,固定為0(由于Java中long的最高位是符號位,正數是0,負數是1)。
  • 時間戳(41位):記錄時間戳,毫秒級。支持69年的時間范圍。
  • 數據中心ID(5位):用來區分不同的數據中心。
  • 機器ID(5位):用來區分同一數據中心內的不同機器。
  • 序列號(12位):同一毫秒內產生的不同ID的序列號。

C#實現Snowflake算法

下面是一個用C#實現的Snowflake算法示例:

using System;

public class SnowflakeIdWorker
{
    private const long SEQUENCE_BIT = 12// 序列號占用的位數
    private const long MACHINE_BIT = 5;   // 機器標識占用的位數
    private const long DATACENTER_BIT = 5// 數據中心占用的位數

    private const long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
    private const long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
    private const long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);

    private long datacenterId; // 數據中心ID
    private long machineId;    // 機器ID
    private long sequence = 0L// 序列號
    private long lastStmp = -1L// 上一次時間戳

    // 起始的時間戳
    private const long START_STMP = 1480166465631L;

    public SnowflakeIdWorker(long datacenterId, long machineId)
    {
        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0)
        {
            throw new ArgumentException("數據中心ID超出范圍");
        }
        if (machineId > MAX_MACHINE_NUM || machineId < 0)
        {
            throw new ArgumentException("機器ID超出范圍");
        }
        this.datacenterId = datacenterId;
        this.machineId = machineId;
    }

    public long NextId()
    {
        long currStmp = GetNewstmp();

        if (currStmp < lastStmp)
        {
            throw new Exception("時鐘倒退, ID生成失敗");
        }

        if (currStmp == lastStmp)
        {
            // 相同毫秒內,序列號自增
            sequence = (sequence + 1) & MAX_SEQUENCE;
            if (sequence == 0L)
            {
                currStmp = GetNextMill();
            }
        }
        else
        {
            // 不同毫秒內,序列號置為0
            sequence = 0L;
        }

        lastStmp = currStmp;

        return ((currStmp - START_STMP) << (SEQUENCE_BIT + MACHINE_BIT + DATACENTER_BIT)) |
               (datacenterId << (SEQUENCE_BIT + MACHINE_BIT)) |
               (machineId << SEQUENCE_BIT) |
               sequence;
    }

    private long GetNextMill()
    {
        long mill = GetNewstmp();
        while (mill <= lastStmp)
        {
            mill = GetNewstmp();
        }
        return mill;
    }

    private long GetNewstmp()
    {
        return (long)(DateTime.UtcNow - new DateTime(197011000, DateTimeKind.Utc)).TotalMilliseconds;
    }
}

class Program
{
    static void Main(string[] args)
    {
        SnowflakeIdWorker idWorker = new SnowflakeIdWorker(11);
        Console.WriteLine(idWorker.NextId());
    }
}

代碼解釋

上述C#代碼實現了一個SnowflakeIdWorker類,該類通過構造函數接收數據中心ID和機器ID,并通過NextId方法生成下一個全局唯一的ID。代碼通過位運算將時間戳、數據中心ID、機器ID和序列號組合成一個64位的長整型數字,確保ID的全局唯一性和趨勢遞增。

結論

分布式ID生成方式多種多樣,每種方式都有其特定的應用場景和優缺點。Snowflake算法作為一種高效、可靠的分布式ID生成方式,被廣泛應用于各種分布式系統中。通過C#實現Snowflake算法,可以方便地集成到各種分布式應用中,滿足全局唯一ID的生成需求。


該文章在 2024/7/8 12:43:20 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
夜鲁夜鲁很鲁在线视频视频 | 久久国产香蕉观看八 | 热久久国产欧美一区二区精品 | 日本一区二区三区免费精品 | 亚洲国产成在人网站天堂 | 日韩国产麻豆中文 |