雪花算法原理(設計原理、優缺點、如何改造它、以及應用)

雪花算法原理(設計原理、優缺點、如何改造它、以及應用)

    • 雪花算法源碼
    • 為什么雪花算法是 64 位?
    • 為什么時間戳是41位?占雪花算法的 43-47 bit 位
    • 為什么工作臺最大只支持設置 31 ?
    • 工作臺設置成了 63 會導致什么后果?
    • 同機器位只支持最大 5 bit位
    • 同理數據累加位只支持最大 12 bit位
    • 雪花算法優點
    • 雪花算法缺點
    • 雪花算法改造
    • 小咸魚的技術窩

雪花算法源碼

雪花算法是一個開源的分布式生成唯一自增 Id 的這么一個工具類。主要的源碼如下

/*** 常規雪花算法:1-42bit位:時間戳 (共 42 位)* 43-47 bit位:數據中心ID (共 5 位,最大支持 2 的 5 次方減 1 個數據中心)* 48-52 bit位:工作臺ID (共 5 位,最大支持 2 的 5 次方減 1 個工作臺)* 53-64 bit位:累加數ID (共 12 位,最大支持 2 的 12 次方)*/
public synchronized long nextId() {long timestamp = timeGen();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) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - twepoch) << 22)| (datacenterId << 17)| (workerId << 12)| sequence;
}

都知道雪花算法結構如下,不知道讀者有沒有想過 為什么雪花算法是 64 位的?為什么工作機器最大為 5 位?,反正我第一次接觸雪花算法的時候,就想過這些問題。

  • 1-42bit位:時間戳 (共 42 位)
  • 43-47 bit位:數據中心ID (共 5 位,最大支持 2 的 5 次方減 1 個數據中心)
  • 48-52 bit位:工作臺ID (共 5 位,最大支持 2 的 5 次方減 1 個工作臺)
  • 53-64 bit位:累加數ID (共 12 位,最大支持 2 的 12 次方)
    在這里插入圖片描述

為什么雪花算法是 64 位?

因為雪花算法返回的是一個 long 類型的值,換算成二進制就是最大 64 位!

為什么時間戳是41位?占雪花算法的 43-47 bit 位

隨便一個時間戳轉換成二進制就是 41 位

log.info("時間戳:{} 位", Long.toBinaryString(System.currentTimeMillis()).length());

在這里插入圖片描述

且雪花算法中的時間戳左移了 22 位,加上時間戳本身的 41 位,加起來就有 63 位了,加上第一位的符號位,就是 64 位,正好等于 long 類型的 64 位。完美利用 long 類型。
在這里插入圖片描述

為什么工作臺最大只支持設置 31 ?

時間戳達到了最大值,41 位時間戳 bit 位全是 1,留了后 22 位全是 0,由于或運算,運算位有 1 就是 1所以說這個 22 位算是留給累加數、工作臺、數據中心的有效左移位,超過這個有效左移位,就會出現生成重復 id 的情況出現。

111111111111111111111111111111111111111110000000000000000000000

工作臺達到最大值 31(31換二進制為11111),左移22位后,會得到如下一個二進制數(位數不足63位,前面用0補齊)

000000000000000000000000000000000000000001111100000000000000000

最終得到的運算結果就是這個

111111111111111111111111111111111111111111111100000000000000000

在這里插入圖片描述

工作臺設置成了 63 會導致什么后果?

63對應的二進制是 6個1(111111),參與的運算結果和工作臺設置成31得到的結果一樣,就有產生的重復 id 的風險了。因此這也是工作臺最大只支持 5 bit 位的原因
在這里插入圖片描述

同機器位只支持最大 5 bit位

在時間戳、工作臺按最大值運算后,留給數據中心的有效運算位只有 17 位了,然后數據中心又左移了12 位,留給數據中心的參與運算的bit就只有5位了(17-12=5)。同理如果數據中心設置成63,也會有生成重復id的風險出現
在這里插入圖片描述

同理數據累加位只支持最大 12 bit位

在時間戳、機器位、工作臺按最大值左移后,留給累加數的有效位只有12bit位了(63-41-5-5=12),看我下圖圈綠的地方這個就是有效bit位。
在這里插入圖片描述

雪花算法優點

按照官方來說就是:

不需要搭建服務集群,代碼邏輯非常簡單,同一毫秒內,訂單ID的序列號自增。同步鎖只作用于本機,機器之間互不影響,每毫秒可以生成4百萬個訂單ID

對比Mysql自增主鍵:

一般雪花算法用于生成訂單ID,相比于 Mysql 自增主鍵來說,Mysql 自增ID是不是很容易看出你的銷量,做個差值計算就好了

對比UUID

UUID是無序的,訂單ID都加索引,在你插入數據的時候,維護B+樹很好性能,需要頻繁的調整葉子結點的數據,還會導致頁分裂。簡而言之就是性能不高,而雪花算法性能高低延遲

雪花算法缺點

由于時間戳占生成id的41 bit位,且這個時間戳是根據服務器時間生成的,一旦服務器時間回撥了一下,你就嗝屁了,可能會生成重復的 id
在這里插入圖片描述

雪花算法改造

基于基因法改造案例如下,詳情點擊跳轉 一文搞懂分庫分表算法,通俗易懂(基因法、一致性 hash、時間維度)

   //41 bit 位時間戳,5 bit 位數據中心,5 bit 機器位,5 bit累加位,7 bit 用戶基因位long orderId = ((timestamp - twepoch) << 22)| (datacenterId << 17)| (workerId << 12)| (sequence << 7)| uid;

小咸魚的技術窩

關注不迷路,分享更多技術干貨B站、CSDN、微信公眾號都是(小咸魚的技術窩),更多詳情在主頁
在這里插入圖片描述

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

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

相關文章

JeecgBoot3.0 漏洞升級 — 快速文檔

近幾年來&#xff0c;黑客攻擊行為呈現出日益復雜和隱蔽的趨勢&#xff0c;對個人和組織的安全造成了嚴重威脅。黑客們不斷尋找新的漏洞和安全漏洞&#xff0c;利用各種手段進行網絡攻擊&#xff0c;包括惡意軟件、網絡釣魚、勒索軟件等。因此&#xff0c;我們每個人都需要關注…

Java 之 final 詳解

目錄 一. 前言 二. final 的基礎使用 2.1. 修飾類 2.2. 修飾方法 2.2.1. private 方法是隱式的 final 2.2.2. final 方法可以被重載 2.3. 修飾參數 2.4. 修飾變量 2.4.1. static final 2.4.2. blank final 2.4.3. 所有 final 修飾的字段都是編譯期常量嗎&#xff1f…

數據結構:二叉查找樹,平衡二叉樹AVLTree,紅黑樹RBTree,平衡多路查找數B-Tree,B+Tree

二叉查找樹 二叉樹具有以下性質&#xff1a;左子樹的鍵值小于根的鍵值&#xff0c;右子樹的鍵值大于根的鍵值。 對該二叉樹的節點進行查找發現深度為1的節點的查找次數為1&#xff0c;深度為2的查找次數為2&#xff0c;深度為n的節點的查找次數為n&#xff0c;因此其平均查找次…

2023年亞太數學建模C題數據分享+詳細思路

在報名截止的前一天&#xff0c;我嘗試進行了報名。到那時&#xff0c;已有11,000個隊伍注冊參賽。在我的了解中&#xff0c;在數模比賽中除了國賽美賽外&#xff0c;幾乎沒有其他競賽的參賽隊伍數量能與此相媲美。即便不考慮賽題的難度和認可度&#xff0c;亞太地區的這場競賽…

JavaScript實現動態背景顏色

JavaScript實現動態背景顏色 前言實現過程HTML實現過程CSS實現過程JS實現過程全部源碼 前言 本文主要講解JavaScript如何實現動態背景顏色&#xff0c;可以根據顏色選擇器選擇的顏色而實時更新到背景中&#xff0c;如下圖所示。 當我們在顏色選擇器中改變顏色時&#xff0c;會…

代碼掃描,漏洞檢測

1) SQL注入是一種數據庫攻擊手段。攻擊者通過向應用程序提交惡意代碼來改變原SQL語句的含義&#xff0c;進而執行任意SQL命令&#xff0c;達到入侵數據庫乃至操作系統的目的。在Mybatis Mapper Xml中&#xff0c;#變量名稱創建參數化查詢SQL語句,不會導致SQL注入。而$變量名稱…

SPSS信度分析

前言&#xff1a; 本專欄參考教材為《SPSS22.0從入門到精通》&#xff0c;由于軟件版本原因&#xff0c;部分內容有所改變&#xff0c;為適應軟件版本的變化&#xff0c;特此創作此專欄便于大家學習。本專欄使用軟件為&#xff1a;SPSS25.0 本專欄所有的數據文件請點擊此鏈接下…

內網滲透之Linux權限提升大法

文章目錄 內網滲透|Linux權限提升大法0x01 前言0x02 工具介紹1.traitor2.LinEnum3.linux-exploit-suggester.sh4.Linux Exploit Suggester 25.beroot 0X02提權手法1.環境變量提權2.利用suid提權3.定時任務提權3.1定時任務文件覆蓋提權3.2定時任務tar命令通配符注入提權 4.sudo提…

【matlab程序】matlab給風速添加圖例大小

【matlab程序】matlab給風速添加圖例大小 clear;clc;close all; % load 加載風速數據。 load(matlab.mat) % 加載顏色包信息 gray load(D:\matlab_work\函數名為colormore的顏色索引表制作\R_color_txt\R_color_single\gray89.txt); brown load(D:\matlab_work\函數名為color…

_STORAGE_WRITE_ERROR_ thinkphp報錯問題原因

整個報錯內容如下 Uncaught exception Think\Exception with message _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/1338db9dec777aab181d4e74d1bdf964.php in C:\inetpub\wwwroot\ThinkPHP\Common\functions.php:101 Stack trace: #0 C:\inetpub\wwwroot\ThinkPHP\Library\…

1. 應用編程概念

1. 應用編程概念 1 系統調用概念1 應用編程和裸機編程、驅動編程的區別 1 系統調用概念 系統調用其實是 Linux 內核提供給應用層的應用編程接口&#xff0c;是 Linux 應用層進入內核的入口。用戶通過系統調用來使用系統提供的各種服務&#xff0c;實現了與內核的交互。 1 應用…

JavaFx 設置窗口邊框圓角

UI界面要求窗口邊框有一定弧度&#xff0c;因為之前沒有做過&#xff0c;網上看了很多文章&#xff0c;都用到了css語句 "-fx-background-radius: ; 我在xml布局文件根節點使用無效&#xff0c;在Scene組件設置無效&#xff0c;gpt等ai問了一圈代碼也是無效&#xff0c;…

【JavaEE】認識多線程

作者主頁&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感謝你閱讀本文&#xff0c;歡迎一建三連哦。 本文錄入于《vaEE》專欄&#xff0c;本專欄是針對于大學生&#xff0c;編程小白精心打造的。筆者用重金(時間和精力)打造&am…

React + BraftEditor 實現富文本編輯

Braft Editor 是一個基于 React 和 Draft-js 開發的富文本編輯器&#xff0c;提供了豐富的基礎功能&#xff0c;如基本文本格式化、列表、鏈接、圖片上傳、視頻插入等&#xff0c;并且還支持擴展。 首先&#xff0c;確保你已經在項目中安裝了 Braft Editor 和它的依賴項&#x…

NPU、CPU、GPU算力及算力計算方式

NVIDIA在9月20日發布的NVIDIA DRIVE Thor 新一代集中式車載計算平臺&#xff0c;可在單個安全、可靠的系統上運行高級駕駛員輔助應用和車載信息娛樂應用。提供 2000 萬億次浮點運算性能&#xff08;2000 萬億次8位浮點運算&#xff09;。NVIDIA當代產品是Orin&#xff0c;算力是…

Java基礎(問題+答案)——第4期

其他的幾期見這個專欄 Java中的多態性&#xff08;Polymorphism&#xff09;&#xff1a; 多態性是指一個對象可以用來引用多個類型的特性。在Java中&#xff0c;多態性通過方法的重寫和接口實現來實現。 Java中的final關鍵字的用途&#xff1a; final可以用于變量、方法和類。…

堪比數據恢復大師軟件推薦,恢復數據很簡單!

“作為一個經常丟失數據的電腦用戶來說&#xff0c;我覺得我非常需要一些簡單有效的數據恢復方法。大家有什么比較靠譜的軟件推薦嗎&#xff1f;非常感謝&#xff01;” 在數字化時代&#xff0c;數據的存儲是比較重要的。很多用戶都會選擇將重要的文件保存在電腦上。如果數據丟…

第二證券:北證50指數一枝獨秀 短劇游戲概念股持續活躍

周三&#xff0c;滬深兩市三大指數顫動調整&#xff0c;北證50指數“鶴立雞群”&#xff0c;大漲超8%。到收盤&#xff0c;上證綜指報3043.61點&#xff0c;跌0.79%&#xff1b;深證成指報9855.66點&#xff0c;跌1.41%&#xff1b;創業板指報1950.01點&#xff0c;跌1.73%。滬…

ITSS項目概述及評估流程!

ITSS項目概述 ITSS (Information Technology Service Standards&#xff0c;信息技術服務標準&#xff0c;簡稱ITSS)是一套成體系和綜合配套的信息技術服務標準庫&#xff0c;全面規范了IT服務產品及其組成要素&#xff0c;用于指導實施標準化和可信賴的IT服務&#xff0c;是套…

CSV用EXCEL打開后為科學計數法(后幾位丟失)解決方法

當在Excel中打開含有長數字&#xff08;如訂單號&#xff09;的CSV文件時&#xff0c;Excel可能會默認將這些長數字格式化為科學計數法。 而當您嘗試將它們轉換為文本格式時&#xff0c;如果數字非常長&#xff0c;Excel可能無法正確處理其精度&#xff0c;導致數字的后幾位變…