雪花算法數據庫主鍵

????????雪花算法(Snowflake)作為一種分布式 ID 生成方案,在分布式系統中具有顯著優勢,能夠解決多個關鍵問題。以下是它的核心好處及主要應用場景:

雪花算法的核心好處

  1. 全局唯一性:通過時間戳、機器 ID、數據中心 ID 和序列號的組合,確保在分布式環境下生成的 ID 絕對唯一
  2. 時間有序性:ID 包含時間戳信息,整體按時間趨勢遞增,對數據庫索引友好
  3. 高性能:本地計算生成,無需網絡請求,單機每秒可生成百萬級 ID
  4. 無依賴:不依賴第三方中間件,節點可獨立工作,降低系統復雜度
  5. 可擴展:支持最多 1024 個節點部署,可通過調整位數分配適配不同規模集群
  6. 節省空間:64 位長整數存儲,比 UUID 更節省空間,計算和傳輸效率更高

雪花算法的主要應用場景

  1. 分布式數據庫的全局唯一主鍵
  2. 訂單系統的訂單號生成
  3. 日志系統的追蹤 ID
  4. 高并發場景下的 ID 生成(如秒殺、搶購)
  5. 分布式任務調度的任務 ID
  6. 消息隊列的消息 ID

完整 Java 實現代碼

public class SnowflakeIdGenerator {// 起始時間戳 (2020-01-01 00:00:00)private final long START_TIMESTAMP = 1577808000000L;// 機器ID所占的位數private final long WORKER_ID_BITS = 5L;// 數據中心ID所占的位數private final long DATA_CENTER_ID_BITS = 5L;// 支持的最大機器IDprivate final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);// 支持的最大數據中心IDprivate final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);// 序列在ID中占的位數private final long SEQUENCE_BITS = 12L;// 機器ID向左移12位private final long WORKER_ID_SHIFT = SEQUENCE_BITS;// 數據中心ID向左移17位(12+5)private final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;// 時間戳向左移22位(5+5+12)private final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;// 生成序列的掩碼,這里為4095private final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS);private long workerId;         // 機器IDprivate long dataCenterId;     // 數據中心IDprivate long sequence = 0L;    // 毫秒內序列private long lastTimestamp = -1L; // 上次生成ID的時間戳/*** 構造函數* @param workerId 機器ID (0~31)* @param dataCenterId 數據中心ID (0~31)*/public SnowflakeIdGenerator(long workerId, long dataCenterId) {if (workerId > MAX_WORKER_ID || workerId < 0) {throw new IllegalArgumentException(String.format("workerId can't be greater than %d or less than 0", MAX_WORKER_ID));}if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) {throw new IllegalArgumentException(String.format("dataCenterId can't be greater than %d or less than 0", MAX_DATA_CENTER_ID));}this.workerId = workerId;this.dataCenterId = dataCenterId;}/*** 生成下一個ID* @return 雪花算法生成的唯一ID*/public synchronized long nextId() {long timestamp = System.currentTimeMillis();// 處理系統時鐘回退if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}// 同一時間戳內序列號自增if (lastTimestamp == timestamp) {sequence = (sequence + 1) & SEQUENCE_MASK;// 序列號溢出,等待下一毫秒if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {// 不同時間戳,序列號重置sequence = 0L;}// 更新上次生成ID的時間戳lastTimestamp = timestamp;// 組合生成IDreturn ((timestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT)| (dataCenterId << DATA_CENTER_ID_SHIFT)| (workerId << WORKER_ID_SHIFT)| sequence;}/*** 等待到下一毫秒*/private long tilNextMillis(long lastTimestamp) {long timestamp = System.currentTimeMillis();while (timestamp <= lastTimestamp) {timestamp = System.currentTimeMillis();}return timestamp;}// 測試public static void main(String[] args) {SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1);// 生成10個IDfor (int i = 0; i < 10; i++) {long id = idGenerator.nextId();System.out.println("生成的ID: " + id);}}
}

????????使用時,只需要為每個節點分配唯一的 workerId 和 dataCenterId 組合,然后調用 nextId () 方法即可生成唯一 ID。在分布式系統中,通常可以通過配置中心或啟動參數來為每個節點分配這些 ID,確保不會重復。

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

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

相關文章

C/C++ 頭文件命名約定

有的時候&#xff0c;在C的代碼中&#xff0c;可以看到有如下的頭文件引用的代碼: #include <iostream> #include <unistd.h> #include <csignal>其中有一些是引用了.h文件&#xff0c;另外一些是引用了模塊式的比如iostream和csignal&#xff0c;那么為什么…

異質結3.0時代的降本提效革命:捷造科技設備技術創新與產業拐點分析

光伏產業經歷了從PERC到TOPCon和異質結&#xff08;HJT&#xff09;的技術迭代&#xff0c;而2025年將成為異質結技術規模化應用的關鍵轉折點。捷造科技通過一系列突破性技術創新&#xff0c;將GW級異質結整線設備價格降至2億元&#xff0c;較行業平均水平降低約40%&#xff0c…

【網絡】http 協議中 Vary 標頭的作用

在 HTTP 協議中&#xff0c;Vary 標頭是一個關鍵的緩存控制機制&#xff0c;用于告知緩存服務器&#xff08;或代理&#xff09;&#xff1a;響應內容的生成依賴于請求中的哪些特定頭部字段。其核心作用是確保緩存服務器能根據這些字段的差異&#xff0c;正確區分和返回不同版本…

CSS 進階用法

一、選擇器進階復雜選擇器組合詳解后代選擇器后代選擇器使用空格分隔兩個選擇器&#xff0c;例如div p&#xff0c;表示選擇div元素內所有的p元素。這種選擇方式會匹配所有層級的后代元素&#xff0c;包括子元素、孫元素等任意深度的嵌套元素。應用示例&#xff1a;/* 選中arti…

GitHub 熱榜項目 - 日榜(2025-08-23)

GitHub 熱榜項目 - 日榜(2025-08-23) 生成于&#xff1a;2025-08-23 統計摘要 共發現熱門項目&#xff1a;13 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術熱點&#xff1a;1&#xff09;AI工作流構建成為風口&#xff0c;sim和airi等項目展示…

SHAP分析+KOA-RIME開普勒結合霜冰算法雙重優化BP神經網絡+9種映射方法+新數據預測!機器學習可解釋分析!

代碼主要功能 該Matlab代碼實現了一個KOA-RIME開普勒結合霜冰算法雙重優化的BP神經網絡回歸模型&#xff0c;結合特征貢獻度分析&#xff08;SHAP&#xff09;和新數據預測功能。核心功能包括&#xff1a; 雙重參數優化&#xff1a;先用智能算法&#xff08;以chebyshev映射改進…

【數據結構】棧和隊列——棧

目錄棧和隊列棧棧的基本概念棧的順序存儲實現棧的定義與初始化入棧操作出棧操作讀取棧頂元素判空和判滿操作棧的銷毀操作操作集合棧和隊列 棧 棧的基本概念 棧的定義&#xff1a; 棧&#xff08;Stack&#xff09; 是一種線性表&#xff0c;它限定了數據元素的插入和刪除操…

大數據管理與應用系列叢書《數據挖掘》讀書筆記之集成學習(1)

文章目錄前言一、集成學習是什么&#xff1f;1.基本思想2.集成學習的類型3. 集成學習的結合策略3.1 為什么結合策略是集成學習的靈魂&#xff1f;3.2 經典策略(1)**投票法&#xff08;Voting&#xff09;****(2)平均法&#xff08;Averaging&#xff09;****(3) 學習法**3.3 關…

嵌入式知識篇---32GUI

要理解 32 位單片機的 GUI&#xff0c;咱們先從 “基礎概念” 入手&#xff0c;再拆成 “為什么能跑 GUI”“核心組成”“怎么實現”“常用工具”“實際用途” 這幾步講&#xff0c;全程不用復雜術語&#xff0c;像聊日常用品一樣說清楚。一、先搞懂 2 個基礎概念在講 “32 位單…

【iOS】SDWebImage第三方庫源碼學習筆記

前言之前在寫項目時&#xff0c;經常用到SDWebImage這個第三方庫來加載圖片&#xff0c;并且了解到了這個第三方庫在處理圖片時自帶異步下載和緩存功能&#xff0c;以及對cell復用的處理。這篇文章來系統學習一下SDWebImage第三方庫的知識以及底層原理簡介SDWebImage為UIImageV…

Linux --網絡基礎概念

一.網絡發展獨立模式&#xff1a;在早期計算機之間是相互獨立的&#xff0c;機器之間的數據只能通過軟硬盤來傳輸&#xff0c;這就代表無法同時完成任務&#xff0c;需要前面的計算機完成各自的任務經過硬盤傳遞數據再完成自己的任務&#xff0c;效率十分低下。網絡互聯&#x…

教育系統搭建攻略:線上知識付費與線下消課排課全解析

作為一名資深平臺測評師&#xff0c;最近我挖到了一個教育機構的 “寶藏工具”—— 喬拓云教育系統。別看它名字低調&#xff0c;用起來那叫一個順手&#xff0c;線上知識付費、線下消課排課全給你安排得明明白白&#xff0c;簡直是機構老板和教務員的 “摸魚神器”。多端口管理…

PMP項目管理知識點-①項目基本概念

目錄 1.項?的定義 概念&#xff1a; 特點&#xff1a; 項?與運營的區別 項?特點&#xff1a; 運營特點&#xff1a; 2.項?管理的發展 3.項?、項?集與項?組合 結構層次 4.項?的關鍵組成部分 項??命周期&#xff1a; 項?管理過程組&#xff1a; 項?階段&…

Python內置函數全解析:30個核心函數語法、案例與最佳實踐指南

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

數據建模怎么做?一文講清數據建模全流程

目錄 一、需求分析 1. 搞清楚業務目標&#xff1a;這數據是要解決啥問題&#xff1f; 2. 明確數據邊界&#xff1a;哪些數據該要&#xff0c;哪些不該要&#xff1f; 3. 弄明白使用場景&#xff1a;誰用這數據&#xff0c;怎么用&#xff1f; 二、模型設計 1. 第一步&…

胸部X光片數據集:健康及肺炎2類,14k+圖像

胸部X光片數據集概述 數據集包含14090張圖像,分為正常胸部X光3901張,肺炎胸部X光10189張。 標注格式:無標注,文件夾分類。 圖像尺寸:640*640 正常胸部X光: 肺炎胸部X光: 數據采集: 拍攝方式:均為前后位(anterior-posterior)胸部X光,屬患者常規臨床護理的一部分…

MySQL數據庫開發教學(二) 核心概念、重要指令

書接上回&#xff1a;MySQL數據庫開發教學(一) 基本架構-CSDN博客 建議工具&#xff1a; Navicat Premium (收費 / 需破解)&#xff1a;Navicat Premium | 管理和開發你的數據庫 phpstudy 2018 (免費)&#xff1a;phpStudy - Windows 一鍵部署 PHP 開發環境 小皮出品 前言 …

【40頁PPT】數字工廠一體化運營管控平臺解決方案(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808811/91716541 資料解讀&#xff1a;【40頁PPT】數字工廠一體化運營管控平臺解決方案 詳細資料請看本解讀文章的最后內容。該資料圍繞數字工廠一體…

數據產品(2)用戶畫像數據分析模型

目錄 1 用戶畫像 2 RFM模型 (用戶價值分群模型) 3 PSM 價格敏感度 4 精細化運營 1 用戶畫像 也稱用戶表標簽,是基于用戶行為分析獲得的對用戶的一種認知表達,即用戶數據標簽化,通過收集與分析用戶的用戶屬性(年齡、性別、城市、職業、設備、狀態)、用戶偏好(購物偏好,聽…

03_數據結構

第3課&#xff1a;數據結構 課程目標 掌握Python的基本數據結構&#xff1a;列表、元組、字典、集合學習字符串的高級操作方法理解不同數據結構的特點和適用場景 1. 列表&#xff08;List&#xff09; 1.1 列表的創建和基本操作 # 創建列表 fruits ["蘋果", "香…