精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

雪花算法,什么情況下發生 ID 沖突?

開發 前端 算法
分布式系統中,有一些需要使用全局唯一 ID 的場景,這種時候為了防止 ID 沖突可以使用 36 位的 UUID,但是 UUID 有一些缺點,首先他相對比較長,另外 UUID 一般是無序的。

[[423697]]

分布式系統中,有一些需要使用全局唯一 ID 的場景,這種時候為了防止 ID 沖突可以使用 36 位的 UUID,但是 UUID 有一些缺點,首先他相對比較長,另外 UUID 一般是無序的

有些時候我們希望能使用一種簡單些的 ID,并且希望 ID 能夠按照時間有序生成

什么是雪花算法

Snowflake 中文的意思是雪花,所以常被稱為雪花算法,是 Twitter 開源的分布式 ID 生成算法

Twitter 雪花算法生成后是一個 64bit 的 long 型的數值,組成部分引入了時間戳,基本保持了自增

SnowFlake 算法的優點:

高性能高可用:生成時不依賴于數據庫,完全在內存中生成

高吞吐:每秒鐘能生成數百萬的自增 ID

ID 自增:存入數據庫中,索引效率高

SnowFlake 算法的缺點:

依賴與系統時間的一致性,如果系統時間被回調,或者改變,可能會造成 ID 沖突或者重復

雪花算法組成

snowflake 結構如下圖所示:

包含四個組成部分

不使用:1bit,最高位是符號位,0 表示正,1 表示負,固定為 0

時間戳:41bit,毫秒級的時間戳(41 位的長度可以使用 69 年)

標識位:5bit 數據中心 ID,5bit 工作機器 ID,兩個標識位組合起來最多可以支持部署 1024 個節點

序列號:12bit 遞增序列號,表示節點毫秒內生成重復,通過序列號表示唯一,12bit 每毫秒可產生 4096 個 ID

通過序列號 1 毫秒可以產生 4096 個不重復 ID,則 1 秒可以生成 4096 * 1000 = 409w ID

默認的雪花算法是 64 bit,具體的長度可以自行配置。如果希望運行更久,增加時間戳的位數;如果需要支持更多節點部署,增加標識位長度;如果并發很高,增加序列號位數

總結:雪花算法并不是一成不變的,可以根據系統內具體場景進行定制

雪花算法適用場景

因為雪花算法有序自增,保障了 MySQL 中 B+ Tree 索引結構插入高性能

所以,日常業務使用中,雪花算法更多是被應用在數據庫的主鍵 ID 和業務關聯主鍵

雪花算法生成 ID 重復問題

假設:一個訂單微服務,通過雪花算法生成 ID,共部署三個節點,標識位一致

此時有 200 并發,均勻散布三個節點,三個節點同一毫秒同一序列號下生成 ID,那么就會產生重復 ID

通過上述假設場景,可以知道雪花算法生成 ID 沖突存在一定的前提條件

服務通過集群的方式部署,其中部分機器標識位一致

業務存在一定的并發量,沒有并發量無法觸發重復問題

生成 ID 的時機:同一毫秒下的序列號一致

標識位如何定義

如果能保證標識位不重復,那么雪花 ID 也不會重復

通過上面的案例,知道了 ID 重復的必要條件。如果要避免服務內產生重復的 ID,那么就需要從標識位上動文章

我們先看看開源框架中使用雪花算法,如何定義標識位

Mybatis-Plus v3.4.2 雪花算法實現類 Sequence,提供了兩種構造方法:無參構造,自動生成 dataCenterId 和 workerId;有參構造,創建 Sequence 時明確指定標識位

Hutool v5.7.9 參照了 Mybatis-Plus dataCenterId 和 workerId 生成方案,提供了默認實現

一起看下 Sequence 的創建默認無參構造,如何生成 dataCenterId 和 workerId

  1. public static long getDataCenterId(long maxDatacenterId) { 
  2.     long id = 1L; 
  3.     final byte[] mac = NetUtil.getLocalHardwareAddress(); 
  4.     if (null != mac) { 
  5.         id = ((0x000000FF & (long) mac[mac.length - 2]) 
  6.                 | (0x0000FF00 & (((long) mac[mac.length - 1]) << 8))) >> 6; 
  7.         id = id % (maxDatacenterId + 1); 
  8.     } 
  9.  
  10.     return id; 

入參 maxDatacenterId 是一個固定值,代表數據中心 ID 最大值,默認值 31

為什么最大值要是 31?因為 5bit 的二進制最大是 11111,剛好是 31

獲取 dataCenterId 時存在兩種情況,一種是網絡接口為空,默認取 1L;另一種不為空,通過 Mac 地址獲取 dataCenterId

可以得知,dataCenterId 的取值與 Mac 地址有關

接下來再看看 workerId

  1. public static long getWorkerId(long datacenterId, long maxWorkerId) { 
  2.     final StringBuilder mpid = new StringBuilder(); 
  3.     mpid.append(datacenterId); 
  4.     try { 
  5.         mpid.append(RuntimeUtil.getPid()); 
  6.     } catch (UtilException igonre) { 
  7.         //ignore 
  8.     } 
  9.     return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); 

入參 maxWorkderId 也是一個固定值,代表工作機器 ID 最大值,默認值 31;datacenterId 取自上述的 getDatacenterId 方法

name 變量值為 PID@IP,所以 name 需要根據 @ 分割并獲取下標 0,得到 PID

通過 MAC + PID 的 hashcode 獲取16個低位,進行運算,最終得到 workerId

分配標識位

Mybatis-Plus 標識位的獲取依賴 Mac 地址和進程 PID,雖然能做到盡量不重復,但仍有小幾率

標識位如何定義才能不重復?有兩種方案:預分配和動態分配

預分配

應用上線前,統計當前服務的節點數,人工去申請標識位

這種方案,沒有代碼開發量,在服務節點固定或者項目少可以使用,但是解決不了服務節點動態擴容性問題

動態分配

通過將標識位存放在 Redis、Zookeeper、MySQL 等中間件,在服務啟動的時候去請求標識位,請求后標識位更新為下一個可用的

通過存放標識位,延伸出一個問題:雪花算法的 ID 是 服務內唯一還是全局唯一

以 Redis 舉例,如果要做服務內唯一,存放標識位的 Redis 節點使用自己項目內的就可以;如果是全局唯一,所有使用雪花算法的應用,要用同一個 Redis 節點

兩者的區別僅是 不同的服務間是否公用 Redis。如果沒有全局唯一的需求,最好使 ID 服務內唯一,因為這樣可以避免單點問題

服務的節點數超過 1024,則需要做額外的擴展;可以擴展 10 bit 標識位,或者選擇開源分布式 ID 框架

動態分配實現方案

Redis 存儲一個 Hash 結構 Key,包含兩個鍵值對:dataCenterId 和 workerId

在應用啟動時,通過 Lua 腳本去 Redis 獲取標識位。dataCenterId 和 workerId 的獲取與自增在 Lua 腳本中完成,調用返回后就是可用的標示位

具體 Lua 腳本邏輯如下:

第一個服務節點在獲取時,Redis 可能是沒有 snowflake_work_id_key 這個 Hash 的,應該先判斷 Hash 是否存在,不存在初始化 Hash,dataCenterId、workerId 初始化為 0

如果 Hash 已存在,判斷 dataCenterId、workerId 是否等于最大值 31,滿足條件初始化 dataCenterId、workerId 設置為 0 返回

dataCenterId 和 workerId 的排列組合一共是 1024,在進行分配時,先分配 workerId

判斷 workerId 是否 != 31,條件成立對 workerId 自增,并返回;如果 workerId = 31,自增 dataCenterId 并將 workerId 設置為 0

dataCenterId、workerId 是一直向下推進的,總體形成一個環狀。通過 Lua 腳本的原子性,保證 1024 節點下的雪花算法生成不重復。如果標識位等于 1024,則從頭開始繼續循環推進

開源分布式 ID 框架

Leaf 和 Uid 都有實現雪花算法,Leaf 額外提供了號段模式生成 ID

美團 Leaf:https://github.com/Meituan-Dianping/Leaf

百度 Uid:https://github.com/baidu/uid-generator

雪花算法可以滿足大部分場景,如無必要,不建議引入開源方案增加系統復雜度

回顧總結

文章通過圖文并茂的方式幫助讀者梳理了一遍什么是雪花算法,以及如何解決雪花算法生成 ID 沖突的問題

關于雪環算法生成 ID 沖突問題,文中給了一種方案:分配標示位;通過分配雪花算法的組成標識位,來達到默認 1024 節點下 ID 生成唯一

可以去看看 Hutool 或者 Mybatis-Plus 雪花算法的具體實現,幫助大家更好的理解

 

雪花算法不是萬能的,并不能適用于所有場景。如果 ID 要求全局唯一并且服務節點超出 1024 節點,可以選擇修改算法本身的組成,即擴展標識位,或者選擇開源方案:LEAF、UID

 

責任編輯:武曉燕 來源: 龍臺的技術筆記
相關推薦

2020-09-24 09:43:59

Http協議options請求

2023-11-23 23:52:06

options請求瀏覽器

2013-09-12 10:41:39

VDI部署

2021-04-23 23:19:26

加密貨幣穩定幣比特幣

2013-07-29 14:50:43

API

2020-11-18 09:26:52

@property裝飾器代碼

2015-06-01 06:39:18

JavaJava比C++

2012-04-25 09:24:40

Android

2025-09-16 07:00:00

雪花算法IDPython

2015-06-29 14:23:13

JavaC++慢很多

2013-09-23 10:05:50

2010-07-13 16:07:26

SQL Server行

2023-05-18 08:38:13

Java鎖機制

2014-11-03 09:52:25

DNSUDPTCP

2024-01-09 11:39:47

數字化轉型數字優先企業

2021-06-04 09:17:13

JavaScriptBoolean函數

2009-03-05 10:55:00

企業無線Wi-Fi

2025-05-26 08:15:00

Go開發指針

2010-04-14 17:46:10

Oracle數據庫

2024-11-07 12:08:27

微服務協議通信
點贊
收藏

51CTO技術棧公眾號

亚洲精品乱码久久久久久金桔影视 | www日韩大片| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 特级西西444www大精品视频| 一级黄色片在线播放| 亚洲蜜桃视频| 亚洲男人天堂久| 伊人成人免费视频| 日韩av中字| 伊人夜夜躁av伊人久久| 日韩精品伦理第一区| 东京干手机福利视频| 久久黄色影院| 欧美国产激情18| 波多野结衣av在线免费观看| 国产一区二区三区| 色综合久久久久久久| 欧洲金发美女大战黑人| 黄色电影免费在线看| 丁香网亚洲国际| 91精品国产综合久久香蕉922| 色网站在线播放| 亚洲成人最新网站| 尤物yw午夜国产精品视频明星| 天堂www中文在线资源| 色综合视频一区二区三区44| 色婷婷亚洲婷婷| 亚洲精品蜜桃久久久久久| 在线国产情侣| 欧美激情一区二区三区蜜桃视频| 国产综合欧美在线看| 亚洲国产精品久久人人爱潘金莲| 久久成人免费日本黄色| 51色欧美片视频在线观看| 欧美精品色哟哟| 亚洲色图国产| 久久精品99久久久香蕉| 男人的天堂官网| 神马影视一区二区| 亚洲精品v天堂中文字幕 | 亚洲日本视频在线| 欧美一级日韩免费不卡| 中文字幕成人在线视频| 韩国精品主播一区二区在线观看| 婷婷成人综合网| 青青草精品视频在线| 97在线视频免费观看完整版| 依依成人综合视频| 欧美一区二区激情| 免费av不卡在线观看| 亚洲蜜桃精久久久久久久| 99精品热视频只有精品10| 日韩精品欧美激情| 欧美大片免费播放器| 丝袜美腿综合| 亚洲欧美成人一区二区在线电影| 亚洲视频在线播放免费| 欧美国产不卡| 亚洲欧美日韩国产中文| 精品人妻中文无码av在线 | 视频在线日韩| 欧美视频在线观看一区二区| 日韩av片网站| 香蕉成人在线| 日韩精品资源二区在线| 中国男女全黄大片| 久久久久影视| 亚洲欧美资源在线| 在线观看免费小视频| 成人免费看片39| 久久深夜福利免费观看| 538任你躁在线精品视频网站| 国内激情久久| 日本精品视频在线播放| 成人一级免费视频| 精品一区二区久久| wwwxx欧美| 丰满人妻一区二区三区无码av| 久久av网址| 蜜臀av性久久久久av蜜臀妖精 | 亚洲乱码一区av黑人高潮| 色欲av无码一区二区三区| 成人免费a**址| 久久久精品中文字幕| 免费网站看av| 免费日韩一区二区| 成人妇女免费播放久久久| 精品人妻一区二区三区浪潮在线| 不卡在线视频中文字幕| 色播亚洲婷婷| 污视频网站在线免费| 欧美视频在线观看 亚洲欧| xxxx一级片| 日韩精品亚洲专区在线观看| 亚洲精品99久久久久| 亚洲黄色小说视频| 中文字幕一区二区三区在线视频 | 亚洲天堂第一区| a级大胆欧美人体大胆666| 91福利精品视频| 欧美精品 - 色网| 日韩欧美天堂| 久久不射热爱视频精品| xxxx.国产| 激情偷乱视频一区二区三区| 999视频在线免费观看| 欧美挠脚心网站| 亚洲激情综合网| www.超碰com| 成人线上播放| 色悠悠久久88| 伊人中文字幕在线观看| 国产成人免费在线视频| 日韩精品久久久毛片一区二区| 任你弄在线视频免费观看| 欧美偷拍一区二区| 精品中文字幕在线播放| 欧美国产综合| 成人乱色短篇合集| 国产三级在线免费观看| 亚洲风情在线资源站| 一级黄色片国产| 亚洲丁香日韩| 久久全球大尺度高清视频| 91久久久久国产一区二区| 91美女精品福利| 欧美另类videosbestsex日本| 亚洲精品一区三区三区在线观看| 亚洲精品电影网站| 国产一区二区免费电影| 国产人成在线观看| 福利一区视频在线观看| 18禁一区二区三区| 女主播福利一区| 成人黄色av免费在线观看| 99中文字幕一区| 日韩欧美在线播放| 玖草视频在线观看| 国产尤物精品| 国产成人亚洲欧美| 蜜桃成人365av| 日韩欧美激情在线| 欧美黑人性猛交xxx| 国产一区二区三区久久悠悠色av| 一区二区三区四区欧美日韩| 成人在线视频观看| 国产亚洲精品美女| 波多野结衣一二区| 国产日韩在线不卡| 无人在线观看的免费高清视频| 亚洲第一二三区| 欧美在线视频观看免费网站| 日韩精品一二| 色视频欧美一区二区三区| 欧美一区二区三区成人精品| 亚洲伊人网站| 欧美日韩精品免费观看视一区二区 | 国产女女做受ⅹxx高潮| 亚洲第一二三区| 国产精品高精视频免费| 在线a人片免费观看视频| 欧美色涩在线第一页| 亚洲综合图片一区| 国产精品一区专区| 欧美成人高潮一二区在线看| 外国成人在线视频| 国产精品久久久久久久一区探花| 2019中文字幕在线视频| 日韩一区二区视频在线观看| 精品少妇爆乳无码av无码专区| 99久久久久久| 成人黄色一区二区| 97精品一区二区| 成人av电影免费| 黄色视屏在线免费观看| 亚洲天天在线日亚洲洲精| 在线观看毛片av| 一区二区三区在线观看国产| 国产 中文 字幕 日韩 在线| 免费高清成人在线| 99中文字幕在线观看| 狼人精品一区二区三区在线| 国产www精品| 成人高清免费在线| 日韩av影片在线观看| 中文字幕一区二区在线视频| 一区二区三区加勒比av| 这里只有久久精品| 国产精品一区免费在线观看| 日韩精品视频久久| 999视频精品| 国产综合色一区二区三区| 国产激情久久| 97人洗澡人人免费公开视频碰碰碰| 国产中文字幕在线观看| 日韩免费成人网| 日韩欧美国产另类| 亚洲一区二区在线免费观看视频| 97人妻精品一区二区免费| 国产精品一区免费视频| 日韩精品无码一区二区三区免费| 亚洲欧美色图| 日韩亚洲视频| 国内精品国产成人国产三级粉色 | 噜噜噜天天躁狠狠躁夜夜精品 | www.成人网| 国产精品亚洲片夜色在线| 欧美日韩在线视频免费观看| 国产午夜一区二区| 欧美性受xxxx狂喷水| 欧美精品一二三区| 国产黄色免费观看| 亚洲在线免费播放| 中文国语毛片高清视频| 久久亚洲一区二区三区四区| 无码人妻丰满熟妇区毛片蜜桃精品| 免费成人在线观看| 激情综合网婷婷| 精品96久久久久久中文字幕无| 一本久道久久综合| 精品视频免费在线观看| 久久精品成人一区二区三区蜜臀| 欧美午夜网站| 91精品国产综合久久久久久蜜臀| 日本电影欧美片| 777777777亚洲妇女| 女子免费在线观看视频www| 精品国产一区二区三区久久久狼| 欧美香蕉爽爽人人爽| 精品国产乱码久久久久久老虎| 97超碰中文字幕| 欧美亚洲国产怡红院影院| 免费观看成人毛片| 五月婷婷激情综合| 免费麻豆国产一区二区三区四区| 亚洲色图在线播放| 可以免费看av的网址| 中文字幕电影一区| 国产破处视频在线观看| 国产欧美精品区一区二区三区| 久久亚洲AV成人无码国产野外| yourporn久久国产精品| 在线播放av网址| 国产69精品久久久久毛片| 久久久无码人妻精品无码| 国产福利一区二区三区视频| 特黄特黄一级片| 国产成人综合在线观看| 在线成人精品视频| 丁香婷婷综合五月| 91精品小视频| 91原创在线视频| 三级黄色片网站| 国产性做久久久久久| 免费看黄色三级| 国产精品美女一区二区| 人人澡人人澡人人看| 亚洲精品日韩一| 精品无码久久久久久久久| 午夜影院在线观看欧美| 六月丁香激情综合| 在线国产亚洲欧美| 国产又粗又猛又爽又黄的| 4438成人网| 日韩在线观看视频一区二区三区| 亚洲激情视频网站| 国产天堂在线| 欧美成人黑人xx视频免费观看| 久久香蕉av| 国产成人精品日本亚洲| 亚洲欧美在线人成swag| 亚洲综合社区网| 欧美自拍一区| 亚洲精品在线免费看| 91tv精品福利国产在线观看| 狠狠干视频网站| 国产情侣久久| 精品久久久噜噜噜噜久久图片| 久久er精品视频| 亚洲乱妇老熟女爽到高潮的片| xfplay精品久久| 久久国产精品国语对白| 天天影视网天天综合色在线播放| 免费看污视频的网站| 91精品国产综合久久久久久久久久 | 日韩中文字幕区一区有砖一区| 国产一区二区在线观看免费视频| 高清日韩电视剧大全免费| 亚洲天堂久久新| 一区二区三区四区激情| 中文字幕在线日本| 日韩精品一区二区三区视频播放 | 国产成人精品免高潮在线观看| 激情五月综合婷婷| 欧美成人第一区| 综合日韩在线| 成人黄色一区二区| 成人涩涩免费视频| 国产精品1区2区3区4区| 午夜视频在线观看一区二区三区 | 成人短视频app| 1卡2卡3卡精品视频| 欧美在线观看视频一区| 无码人妻丰满熟妇区96| 国产一区二区三区免费观看| 丁香花五月婷婷| 香蕉久久一区二区不卡无毒影院 | 韩国成人在线| 国产精品久久久久av福利动漫| 日韩精品免费一区二区在线观看| 欧美亚洲日本一区二区三区 | 亚洲一区二区三区无码久久| 亚洲日本va在线观看| 无码人妻精品一区二区三区9厂 | 欧美特级黄色录像| 亚洲成av人片一区二区三区| 国产熟女精品视频| 最近2019中文字幕在线高清| 成人线上视频| 极品尤物一区二区三区| 国自产拍偷拍福利精品免费一| caoporm在线视频| 国产精品欧美一区二区三区| 欧美一区二区三区不卡视频| 精品国产1区2区3区| 午夜dj在线观看高清视频完整版| 国产乱肥老妇国产一区二| 国产一区二区三区电影在线观看 | 国产第100页| 日韩欧美国产不卡| 超碰caoporn久久| 国产综合久久久久久| 日产午夜精品一线二线三线| 日韩在线第三页| www久久久久| 91porny在线| 亚洲高清久久网| 91白丝在线| 国产精品青青草| 精品成人免费| www.男人天堂| 精品久久久久久亚洲国产300| 亚洲精品综合网| 午夜免费日韩视频| 欧美日韩直播| 国产最新免费视频| 26uuu精品一区二区| 日日骚av一区二区| 亚洲色图欧美制服丝袜另类第一页| 东京一区二区| 欧美另类高清视频在线| 老**午夜毛片一区二区三区| 黄色片在线观看免费| 欧美日韩五月天| 午夜小视频在线观看| 成人在线看片| 一本色道久久综合亚洲精品高清| 亚洲av无码成人精品国产| 色老综合老女人久久久| 9191在线| 97人人干人人| 国产精品毛片在线看| 亚洲精品91在线| 欧美浪妇xxxx高跟鞋交| 天堂av在线电影| 国产日本一区二区三区| 美女精品在线观看| 一级片黄色录像| 日韩视频免费观看高清完整版 | 一区二区三区电影大全| 四虎一区二区| 国产一区二区在线视频| 精品视频久久久久| 亚洲视频视频在线| 香蕉成人在线| www.日本在线播放| 中文无字幕一区二区三区| 国产福利小视频| 57pao国产成人免费| 99国产**精品****| 黄色激情在线观看| 欧美在线视频不卡| 激情成人四房播| 久久久久久久久久久久久久一区 | 国产精品入口日韩视频大尺度| 一区二区在线影院| 亚洲男人在线天堂| 在线播放日韩导航| 亚洲最大网站| 国产免费xxx| 国产日韩欧美一区二区三区综合| 国产精品熟女久久久久久| 777精品视频| 女人香蕉久久**毛片精品| av男人的天堂av| 精品成人免费观看| 亚洲欧美久久精品| 日韩久久一级片| 亚洲一区欧美一区| 日本视频在线观看|