
目錄
- 雪花演算法簡介
- 雪花演算法的優缺點
- 雪花演算法原理
- 雪花演算法代碼實作
雪花演算法簡介
雪花演算法,英文名為snowflake,翻譯過來就是是雪花,所以叫雪花演算法,
在大自然雪花形成程序中,會形成不同的結構分支,所以說不存在兩片完全一樣的雪花,表示生成的id如雪花般獨一無二,

雪花演算法,它最早是twitter內部使用的分布式環境下的唯一分布式ID生成演算法,
雪花演算法的優缺點
雪花演算法,它至少有如下4個優點:
1.系統環境ID不重復
能滿足高并發分布式系統環境ID不重復,比如大家熟知的分布式場景下的資料庫表的ID生成,
2.生成效率極高
在高并發,以及分布式環境下,除了生成不重復 id,每秒可生成百萬個不重復 id,生成效率極高,
3.保證基本有序遞增
基于時間戳,可以保證基本有序遞增,很多業務場景都有這個需求,
4.不依賴第三方庫
不依賴第三方的庫,或者中間件,演算法簡單,在記憶體中進行,
雪花演算法,有一個比較大的缺點:
依賴服務器時間,服務器時鐘回撥時可能會生成重復 id,
雪花演算法原理
詳細的雪花演算法構造如下圖所示:

雪花演算法的原理:就是生成一個的 64 位的 long 型別的唯一 id,主要分為如下4個部分組成:
1)1位保留 (基本不用)
1位標識:由于long基本型別在Java中是帶符號的,最高位是符號位,正數是0,負數是1,所以id一般是正數,最高位是0,所以這第一位都是0,
2)41位時間戳
接下來 41 位存盤毫秒級時間戳,41位可以表示2^41-1個毫秒的值,轉化成單位年則是:(2^41?1)/(1000?60?60?24?365)=69年 ,
41位時間戳 :也就是說這個時間戳可以使用69年不重復,大概可以使用 69 年,
注意:41位時間截不是存盤當前時間的時間截,而是存盤時間截的差值“當前時間截 – 開始時間截”得到的值,
這里的的開始時間截,一般是我們的id生成器開始使用的時間,由我們程式來指定的,一般設定好后就不要去改變了,切記!!!
因為,雪花演算法有如下缺點:依賴服務器時間,服務器時鐘回撥時可能會生成重復 id,
3)10位機器
10位的資料機器位,可以部署在1024個節點,包括5位datacenterId和5位workerId,最多可以部署 2^10=1024 臺機器,
這里的5位可以表示的最大正整數是2^5?1=31,即可以用0、1、2、3、….31這32個數字,來表示不同的datecenterId,或workerId,
4) 12bit序列號
用來記錄同毫秒內產生的不同id,12位的計數順序號支持每個節點每毫秒(同一機器,同一時間截)產生4096個ID序號,
理論上雪花演算法方案的QPS約為409.6w/s,這種分配方式可以保證在任何一個IDC的任何一臺機器在任意毫秒內生成的ID都是不同的,



作者簡介
陳睿|mikechen,10年+大廠架構經驗,《BAT架構技術500期》系列文章作者,專注于互聯網架構技術,
閱讀mikechen的互聯網架構更多技術文章合集
Java并發|JVM|MySQL|Spring|Redis|分布式|高并發
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/514143.html
標籤:其他
