Redis之全局唯一ID

全局ID生成器

在這里插入圖片描述

文章目錄

  • 全局ID生成器
    • 一、全局ID生成器的定義
      • 定義
      • 核心作用
    • 二、全局ID生成器需滿足的特征
      • 1. 唯一性(Uniqueness)?
      • 2. 高性能(High Performance)?
      • 3. 可擴展性(Scalability)?
      • 4. 有序性(Orderliness)?
      • 5. 可靠性(Reliability)?
      • 6. 安全性(Security)?
      • 7. 兼容性(Compatibility)?
    • 三、全局唯一ID生成策略:
      • 1. UUID
      • 2. 數據庫自增ID
      • 3. Snowflake算法(Twitter開源)?
      • 4. Redis自增
      • 5. 數據庫號段模式
      • 6. Leaf(美團開源)?
    • 四、策略對比
    • 五、選型建議

一、全局ID生成器的定義

定義

  • 全局ID生成器是一種在分布式系統中生成唯一標識符(ID)的機制,確保生成的ID在整個系統范圍內(可能跨多個服務、數據庫或數據中心)具有唯一性。它是解決分布式環境下數據唯一性、數據關聯和事務協調等問題的核心技術之一。

核心作用

  • ?唯一性:確保每個生成的ID在全局范圍內不重復。
  • 可識別性:通過ID快速定位資源或關聯業務(如訂單、用戶、消息等),不能被看出太明顯的規律。
  • ?擴展性:支持系統規模增長(如分庫分表、多節點部署)時仍能高效生成ID,高效應對海量數據。

二、全局ID生成器需滿足的特征

全局ID生成器,是分布式系統環境下生成全局唯一ID的工具,一般需要滿足下列特征:

1. 唯一性(Uniqueness)?

  • ?核心要求:生成的ID在全局范圍內絕對唯一。
  • 意義:避免數據沖突(如主鍵重復、消息覆蓋)。
  • 實現方式
    • 算法設計(如Snowflake通過時間戳+機器ID+序列號保證唯一)。
    • 中心化協調(如數據庫自增ID依賴數據庫的唯一約束)。

2. 高性能(High Performance)?

  • ?要求:生成ID的速度快,延遲低,支持高并發場景。
  • 意義:避免成為系統瓶頸(如秒殺場景下每秒生成數十萬ID)。
  • 實現方式
    • 本地生成(如Snowflake在內存中生成,無需網絡請求)。
    • 批量預分配(如數據庫號段模式一次性獲取多個ID)。

3. 可擴展性(Scalability)?

  • 要求:支持系統橫向擴展(如新增節點)時無需重構ID生成邏輯。
  • 意義:適應業務增長,避免單點瓶頸。
  • 實現方式
    • 分布式算法(如Snowflake允許動態增加機器ID)。
    • 去中心化設計(如UUID無需中心節點)。

4. 有序性(Orderliness)?

  • ?要求:生成的ID按時間遞增或可排序。
  • 意義:便于數據庫索引優化、分頁查詢和業務排序(如按時間排序訂單)。
  • ?實現方式
    • 時間戳高位(如Snowflake將時間戳放在ID的高位)。
    • 數據庫自增ID天然有序,但分布式下需分片步長策略。

5. 可靠性(Reliability)?

  • 要求:生成過程容錯,避免單點故障。
  • 意義:保障系統高可用(如機器宕機不影響ID生成)。
  • 實現方式
    • 去中心化算法(如Snowflake無單點依賴)。
    • 冗余設計(如Leaf通過ZooKeeper管理機器ID,支持故障轉移)。

6. 安全性(Security)?

  • ?要求:防止ID被猜測或遍歷(如避免暴露業務量或用戶隱私)。
  • 意義:防止惡意攻擊(如通過ID遍歷批量查詢數據)。
  • 實現方式
    • 加入隨機性(如UUIDv4的隨機部分)。
    • 加密或哈希處理(如美團的Leaf-Segment加密號段)。

7. 兼容性(Compatibility)?

  • 要求:ID格式適配現有技術棧(如數據庫類型、網絡傳輸)。
  • 意義:降低集成成本(如避免使用超長ID導致存儲浪費)。
  • 實現方式
    • 數值型ID(如Snowflake的64位Long類型,兼容MySQL BIGINT)。
    • 字符串ID(如UUID的128位字符串,適配NoSQL數據庫)。

三、全局唯一ID生成策略:

1. UUID

  • 原理:生成128位隨機字符串(如 550e8400-e29b-41d4-a716-446655440000)。
  • 優點:簡單、無需中心化協調。
  • 缺點:無序、長度長、存儲和索引效率低。
  • 適用場景:非高頻查詢場景,如日志跟蹤、臨時標識。
  • 優化:使用UUIDv4(隨機生成)避免隱私問題。

2. 數據庫自增ID

  • ?原理:利用數據庫自增主鍵生成唯一ID。
  • 優點:簡單、天然有序。
  • ?缺點:單點瓶頸、橫向擴展困難。
  • ?優化
    • 分庫分表:為每個分片設置不同步長(如庫1步長=2,起始值=1;庫2步長=2,起始值=2)。
    • 批量獲取:一次性申請多個ID(如 INSERT … SELECT MAX(id)+N)。

3. Snowflake算法(Twitter開源)?

  • ID結構?(64位):
    | 符號位(1) | 時間戳(41) | 機器ID(10) | 序列號(12) |
    
  • 優點:有序、高性能、去中心化。
  • ?缺點:依賴系統時鐘(時鐘回撥需處理)。
  • 實現
    public class Snowflake {private final long machineId;   // 機器ID(0~1023)private long lastTimestamp = -1L;private long sequence = 0L;public synchronized long nextId() {long timestamp = System.currentTimeMillis();if (timestamp < lastTimestamp) throw new RuntimeException("時鐘回撥");if (timestamp == lastTimestamp) {sequence = (sequence + 1) & 0xFFF; // 序列號自增,溢出則等待下一毫秒if (sequence == 0) timestamp = waitNextMillis();} else {sequence = 0;}lastTimestamp = timestamp;return ((timestamp - TWEPOCH) << 22) | (machineId << 12) | sequence;}
    }
    

4. Redis自增

  • 原理:利用Redis的原子操作 INCR 或 INCRBY 生成自增ID。使用Java的Long類型存儲,為了增加ID的安全性,我們可以不直接只用Redis自增的數值,而是拼接一些其他信息:

    ID的組成部分(Java Long類型存儲,占用8個字節,也就是64個比特位):0  - 0000000 00000000 00000000 00000000 - 00000000 00000000 00000000 00000000↑                  ↑                                     ↑符號位 |<------- 時間戳(31 bit)-------->|  |<-------- 序列號(32 bit)-------->|
    
    • 符號位: 1 bit,永遠為0(表示正數)
    • 時間戳:31 bit,以秒為單位,以2000年1月1日00時作為參照系,用當前時間 - 參照時間 = 時間戳,2^31 秒 約等于69年。
    • 序列號:31 bit,Redis自增的值,該方式理論上支持每秒產生 2^32 個不同ID。
  • ?優點:高性能、簡單。

  • 缺點:依賴Redis可用性,需處理持久化問題。

  • 優化:集群模式 + 多Key分片(如 order_id:shard_1)。

  • 實現

    @Component
    public class RedisIdGenerator {/*** 開始時間戳 2000年1月1日零時零分零秒*/private static final long BEGIN_TIMESTAMP = 946684800L;/*** 序列號位數*/private static final int COUNT = 32;private StringRedisTemplate stringRedisTemplate;@Autowiredpublic RedisIdGenerator(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}public long nextId(String keyPrefix) {// 1.生成時間戳LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - BEGIN_TIMESTAMP;// 2.生成序列號String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd")); // 使用冒號分割,方便統計Long increment = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date); // 加入日期,防止超出2^32上限(Redis自增上限為2^64)long incrementUnbox = 0L;if (increment != null) {incrementUnbox = increment;}// 3.拼接并返回return timestamp << COUNT | incrementUnbox; // 左移 32位,拼接時間戳和序列號}public static void main(String[] args) {// 2000年1月1日零時零分零秒 的秒數LocalDateTime time = LocalDateTime.of(2000, 1, 1, 0, 0, 0);long second = time.toEpochSecond(ZoneOffset.UTC);System.out.println("second = " + second); // second = 946684800}
    }
    

5. 數據庫號段模式

  • 原理:從數據庫批量獲取號段(如一次分配1000個ID),緩存在本地使用。
  • ?表設計
    CREATE TABLE id_segment (biz_tag VARCHAR(32) PRIMARY KEY,  -- 業務標識max_id BIGINT NOT NULL,           -- 當前最大IDstep INT NOT NULL                 -- 每次步長
    );
    
  • 優點:減少數據庫壓力、可擴展性強。
  • 缺點:需維護號段表,處理并發沖突。

6. Leaf(美團開源)?

  • ?混合模式
    • 號段模式:類似數據庫號段,依賴數據庫。
    • Snowflake模式:依賴ZooKeeper分配機器ID。
  • 優點:高可用、靈活切換模式。
  • 實現:通過ZooKeeper管理機器ID,支持號段預分配。

四、策略對比

策略唯一性有序性性能可靠性典型場景
UUID???日志跟蹤、臨時標識
?數據庫自增ID???(單點)中小規模分庫分表
Snowflake??極高?(去中心化)高并發訂單、消息隊列
Redis INCR???(依賴Redis)短期唯一ID(如會話ID)
?Leaf(美團)????(混合模式)大規模分布式系統

五、選型建議

場景推薦方案關鍵考慮
高性能、有序IDSnowflake處理時鐘回撥(NTP同步、異常等待)
簡單、無序UUID v4適合臨時標識
依賴RedisRedis INCR需保障Redis高可用
數據庫友好、可控數據庫號段模式適合中小規模分布式系統
企業級復雜場景Leaf結合號段和Snowflake優勢

實際選型建議

  1. ?高并發有序ID:優先選擇Snowflake或其變種(如美團的Leaf-Segment)。
  2. ?簡單臨時標識:使用UUID v4(如用戶臨時Token)。
  3. ?數據庫友好場景:數據庫號段模式(如分庫分表的預分配ID)。
  4. ?強一致性需求:結合Redis或ZooKeeper的分布式鎖生成ID。

常見問題處理

  1. 時鐘回撥
    • 方案:記錄上次時間戳,發現回撥時拋出異常或等待時鐘追上。
    • 優化:使用NTP同步服務器時間,或擴展Snowflake增加時間戳位數。
  2. 機器ID分配
    • 方案:ZooKeeper/配置中心動態分配,或按數據中心+機器ID編碼。

根據業務規模、一致性要求及運維成本選擇合適的策略,必要時可組合使用多種方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79318.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx中的代理緩存

1.緩存存放路徑 對key取哈希值之后&#xff0c;設置cache內容&#xff0c;然后得到的哈希值的倒數第一位作為第一個子目錄&#xff0c;倒數第三位和倒數第二位組成的字符串作為第二個子目錄&#xff0c;如圖。 proxy_cache_path /xxxx/ levels1:2 2.文件名哈希值

靜態時序分析STA——8.1 時序檢查(建立時間檢查)

文章目錄 一、時序路徑組二、建立時間檢查1. 觸發器到觸發器路徑1&#xff09;時鐘單元UCKBUF0的延遲計算2&#xff09;時鐘源延遲&#xff08;clock source latency&#xff09; 2. 輸入到觸發器路徑1) 虛擬時鐘的輸入路徑2) 具有實際時鐘的輸入路徑 3. 觸發器到輸出路徑4. 輸…

了解高速設計的信號完整性仿真

高速設計需要精確的信號傳輸&#xff0c;以確保最佳性能。信號完整性差會導致關鍵應用中的誤碼、數據損壞甚至系統故障等問題。介電常數、損耗角正切和插入損耗等因素會顯著影響信號質量。通過使用信號完整性仿真&#xff0c;您可以及早發現并解決這些挑戰。這種主動方法有助于…

RAGFlowwindows本地pycharm運行

Python環境準備 1. 安裝pipx。如已經安裝&#xff0c;可跳過本步驟&#xff1a; python -m pip install --user pipxpython -m pipx ensurepath## 驗證安裝pipx --version2. 安裝 uv。如已經安裝&#xff0c;可跳過本步驟&#xff1a; pipx install uv ## 設置為阿里云 PyPI…

STM32-FreeRTOS的詳細配置

配置FreeRTOS 原文鏈接&#xff1a;https://ydamooc.github.io/posts/c9defcd/ 1.1 下載FreeRTOS 打開FreeRTOS官網&#xff1a;https://www.freertos.org/ 點擊下載&#xff0c;并且選擇"FreeRTOS 202212.01"版本&#xff0c;再點擊Download按鈕下載官方的資源包…

Linux筆記---動靜態庫(原理篇)

1. ELF文件格式 動靜態庫文件的構成是什么樣的呢&#xff1f;或者說二者的內容是什么&#xff1f; 實際上&#xff0c;可執行文件&#xff0c;目標文件&#xff0c;靜態庫文件&#xff0c;動態庫文件都是使用ELF文件格式進行組織的。 ELF&#xff08;Executable and Linkable…

HVV-某田相關經歷

一、背景 本次項目為期兩周&#xff0c;由集團主導招募攻擊隊員對集團下屬及其子公司進行的攻防演練。本次項目主導研判分析應急排查內部Nday發掘。 二、研判分析 2.1、帆軟V10 漏洞概述 帆軟 V10 及 V11 版本報表軟件存在反序列化漏洞&#xff0c;攻擊者可利用該漏洞使用…

AI與物聯網的深度融合:開啟智能生活新時代

在當今數字化時代&#xff0c;人工智能&#xff08;AI&#xff09;和物聯網&#xff08;IoT&#xff09;作為兩大前沿技術&#xff0c;正在加速融合&#xff0c;為我們的生活和工作帶來前所未有的變革。這種融合不僅提升了設備的智能化水平&#xff0c;還為各行各業帶來了新的機…

Linux `init` 相關命令的完整使用指南

Linux init 相關命令的完整使用指南—目錄 一、init 系統簡介二、運行級別&#xff08;Runlevel&#xff09;詳解三、常用 init 命令及使用方法1. 切換運行級別2. 查看當前運行級別3. 服務管理4. 緊急模式&#xff08;Rescue Mode&#xff09; 四、不同 Init 系統的兼容性1. Sy…

UNet 改進(12):UNet with ECA (Efficient Channel Attention) 網絡

詳解 下面將詳細解析這個實現了ECA注意力機制的UNet網絡代碼。 1. 代碼概述 代碼實現了一個帶有Efficient Channel Attention (ECA)模塊的UNet網絡架構。 UNet是一種常用于圖像分割任務的編碼器-解碼器結構網絡,而ECA模塊則是一種輕量級的通道注意力機制,可以增強網絡對重…

視頻監控EasyCVR視頻匯聚平臺接入海康監控攝像頭如何配置http監聽功能?

一、方案概述 本方案主要通過EasyCVR視頻管理平臺&#xff0c;實現報警信息的高效傳輸與實時監控。海康監控設備能通過HTTP協議將報警信息發送至指定的目的IP或域名&#xff0c;而EasyCVR平臺則可以接收并處理這些報警信息&#xff0c;同時提供豐富的監控與管理功能&#xff0…

人工智能與網絡安全:AI如何預防、檢測和應對網絡攻擊?

引言&#xff1a;網絡安全新戰場&#xff0c;AI成關鍵角色 在數字化浪潮不斷推進的今天&#xff0c;網絡安全問題已經成為每一家企業、每一個組織無法回避的“隱形戰場”。無論是電商平臺、金融機構&#xff0c;還是政府機關、制造企業&#xff0c;都可能面臨數據泄露、勒索病毒…

3D人臉掃描技術如何讓真人“進入“虛擬,虛擬數字人反向“激活“現實?

隨著虛擬人技術的飛速發展&#xff0c;超寫實數字人已經成為數字娛樂、廣告營銷和虛擬互動領域的核心趨勢。無論是企業家、知名主持人還是明星&#xff0c;數字分身正在以高度還原的形象替代真人參與各類活動&#xff0c;甚至成為品牌代言、直播互動的新寵。 3D人臉掃描&#…

遞歸函數詳解

定義 遞歸是指一個函數在其定義中直接或間接地調用自身的方法。通過這種方式&#xff0c;函數可以將一個復雜的問題分解為規模更小的、與原問題相似的子問題&#xff0c;然后通過不斷地解決這些子問題來最終解決整個問題。 組成部分 遞歸主體 這是函數中遞歸調用自身的部分…

ASP.NET Core Web API 配置系統集成

文章目錄 前言一、配置源與默認設置二、使用步驟1&#xff09;創建項目并添加配置2&#xff09;配置文件3&#xff09;強類型配置類4&#xff09;配置Program.cs5&#xff09;控制器中使用配置6&#xff09;配置優先級測試7&#xff09;動態重載配置測試8&#xff09;運行結果示…

在生信分析中,從生物學數據庫中下載的序列存放在哪里?要不要建立一個小型數據庫,或者存放在Gitee上?

李升偉 整理 在Galaxy平臺中使用時&#xff0c;從NCBI等生物學數據庫下載的DNA序列的存儲位置和管理方式需要根據具體的工作流程和需求進行調整。以下是詳細的分步說明和建議&#xff1a; 一、Galaxy中DNA序列的默認存儲位置 在Galaxy的“歷史記錄”&#xff08;History&…

SDK游戲盾如何接入?復雜嗎?

接入SDK游戲盾&#xff08;通常指游戲安全防護類SDK&#xff0c;如防DDoS攻擊、防作弊、防外掛等功能&#xff09;的流程和復雜度取決于具體的服務商&#xff08;如騰訊云、上海云盾等&#xff09;以及游戲類型和技術架構。以下是一般性的接入步驟、復雜度評估及注意事項&#…

通過類似數據蒸餾或主動學習采樣的方法,更加高效地學習良品數據分布

好的&#xff0c;我們先聚焦第一個突破點&#xff1a; 通過類似數據蒸餾或主動學習采樣的方法&#xff0c;更加高效地學習良品數據分布。 這里我提供一個完整的代碼示例&#xff1a; ? Masked圖像重建 殘差熱力圖 這屬于自監督蒸餾方法的一個變體&#xff1a; 使用一個 預…

【課題推薦】多速率自適應卡爾曼濾波(MRAKF)用于目標跟蹤

多速率自適應卡爾曼濾波(Multi-Rate Adaptive Kalman Filter, MRAKF)是一種針對多傳感器異步數據融合的濾波算法,適用于傳感器采樣率不同、噪聲特性時變的目標跟蹤場景。本文給出一個多速率自適應卡爾曼濾波框架,以無人機跟蹤場景為例,融合IMU和GPS數據 文章目錄 背景多速…

軟考 系統架構設計師系列知識點之雜項集萃(49)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;48&#xff09; 第76題 某文件管理系統在磁盤上建立了位視圖&#xff08;bitmap&#xff09;&#xff0c;記錄磁盤的使用情況。若磁盤上物理塊的編號依次為&#xff1a;0、1、2、……&#xff1b…