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

雪花算法:分布式唯一ID生成利器

開發 前端
無論是在分布式系統中的ID生成,還是在業務系統中請求流水號這一類唯一編號的生成,都是軟件開發人員經常會面臨的一場景。而雪花算法便是這些場景的一個解決方案。

前言

以分布式ID為例,它的生成往往會在唯一性、遞增性、高可用性、高性能等方面都有所要求。并且在業務處理時,還要防止爬蟲根據ID的自增進行數據爬取。而雪花算法,在這些方面表現得都不錯。

常見分布式ID生成

市面上比較常見的分布式ID生成算法及類庫:

UUID:Java自帶API,生成一串唯一隨機36位字符串(32個字符串+4個“-”)??梢员WC唯一性,但可讀性差,無法有序遞增。

SnowFlake:雪花算法,Twitter開源的由64位整數組成分布式ID,性能較高,并且在單機上遞增。GitHub上官方地址:https://github.com/twitter-archive/snowflake/tree/snowflake-2010 。

UidGenerator:百度開源的分布式ID生成器,基于雪花算法。GitHub參考鏈接:https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md 。該項目的說明文檔及測試案例都值得深入學習一下。

Leaf:美團開源的分布式ID生成器,能保證全局唯一,趨勢遞增,但需要依賴關系數據庫、Zookeeper等中間件。相關實現可參考該文:https://tech.meituan.com/2017/04/21/mt-leaf.html 。

雪花算法

雪花(snowflake),美麗、獨特又變幻莫測。在大自然中幾乎找不到兩片完全一樣的雪花。雪花的這些特性正好在雪花算法上有所展示。

SnowFlake算法是Twitter開源的分布式ID生成算法。核心思想就是:使用一個64 bit的 long 型的數字作為全局唯一ID。算法中還引入了時間戳,基本上保證了自增特性。

最初的版本的雪花算法是基于scala寫的,當然,不同的編程語言都可以根據其算法邏輯進行實現。

雪花算法原理

SnowFlake算法生成ID的結果是一個64bit大小的整數,結構如下圖:

算法解析:

  • 第一個部分:1個bit,無意義,固定為0。二進制中最高位是符號位,1表示負數,0表示正數。ID都是正整數,所以固定為0。
  • 第二個部分:41個bit,表示時間戳,精確到毫秒,可以使用69年。時間戳帶有自增屬性。
  • 第三個部分:10個bit,表示10位的機器標識,最多支持1024個節點。此部分也可拆分成5位datacenterId和5位workerId,datacenterId表示機房ID,workerId表示機器ID。
  • 第四部分:12個bit,表示序列化,即一些列的自增ID,可以支持同一節點同一毫秒生成最多4095個ID序號。

由于在Java中64bit的整數是long類型,所以在Java中SnowFlake算法生成的id就是long來存儲的。

雪花算法Java實現

雪花算法Java工具類實現:

public class SnowFlake {

/**
* 起始的時間戳(可設置當前時間之前的鄰近時間)
*/
private final static long START_STAMP = 1480166465631L;

/**
* 序列號占用的位數
*/
private final static long SEQUENCE_BIT = 12;
/**
* 機器標識占用的位數
*/
private final static long MACHINE_BIT = 5;
/**
* 數據中心占用的位數
*/
private final static long DATA_CENTER_BIT = 5;

/**
* 每一部分的最大值
*/
private final static long MAX_DATA_CENTER_NUM = ~(-1L << DATA_CENTER_BIT);
private final static long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT);
private final static long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);

/**
* 每一部分向左的位移
*/
private final static long MACHINE_LEFT = SEQUENCE_BIT;
private final static long DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private final static long TIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT;

/**
* 數據中心ID(0~31)
*/
private final long dataCenterId;
/**
* 工作機器ID(0~31)
*/
private final long machineId;
/**
* 毫秒內序列(0~4095)
*/
private long sequence = 0L;
/**
* 上次生成ID的時間截
*/
private long lastStamp = -1L;

public SnowFlake(long dataCenterId, long machineId) {
if (dataCenterId > MAX_DATA_CENTER_NUM || dataCenterId < 0) {
throw new IllegalArgumentException("dataCenterId can't be greater than MAX_DATA_CENTER_NUM or less than " +
"0");
}
if (machineId > MAX_MACHINE_NUM || machineId < 0) {
throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
}
this.dataCenterId = dataCenterId;
this.machineId = machineId;
}

/**
* 產生下一個ID
*/
public synchronized long nextId() {
long currStamp = getNewStamp();
if (currStamp < lastStamp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
}

if (currStamp == lastStamp) {
//相同毫秒內,序列號自增
sequence = (sequence + 1) & MAX_SEQUENCE;
//同一毫秒的序列數已經達到最大
if (sequence == 0L) {
//阻塞到下一個毫秒,獲得新的時間戳
currStamp = getNextMill();
}
} else {
//不同毫秒內,序列號置為0
sequence = 0L;
}

lastStamp = currStamp;

// 移位并通過或運算拼到一起組成64位的ID
return (currStamp - START_STAMP) << TIMESTAMP_LEFT //時間戳部分
| dataCenterId << DATA_CENTER_LEFT //數據中心部分
| machineId << MACHINE_LEFT //機器標識部分
| sequence; //序列號部分
}

private long getNextMill() {
long mill = getNewStamp();
while (mill <= lastStamp) {
mill = getNewStamp();
}
return mill;
}

private long getNewStamp() {
return System.currentTimeMillis();
}

public static void main(String[] args) {
SnowFlake snowFlake = new SnowFlake(11, 11);

long start = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
System.out.println(snowFlake.nextId());
}

System.out.println(System.currentTimeMillis() - start);
}
}

上述代碼中,在算法的核心方法上,通過加synchronized鎖來保證線程安全。這樣,同一服務器線程是安全的,生成的ID不會出現重復,而不同服務器由于機器碼不同,就算同一時刻兩臺服務器都產生了雪花ID,結果也是不一樣的。

其他問題

41位時間戳最長只能有69年

下面來用程序推算一下,41位時間戳為什么只能支持69年。

41的二進制,最大值也就41位都是1,也就是說41位可以表示2^{41}-1個毫秒的值,轉化成單位年則是(2^{41}-1) / (1000 * 60 * 60 * 24 *365) = 69年。

通過代碼驗證一下:

public static void main(String[] args) {
//41位二進制最小值
String minTimeStampStr = "00000000000000000000000000000000000000000";
//41位二進制最大值
String maxTimeStampStr = "11111111111111111111111111111111111111111";
//轉10進制
long minTimeStamp = new BigInteger(minTimeStampStr, 2).longValue();
long maxTimeStamp = new BigInteger(maxTimeStampStr, 2).longValue();
//一年總共多少毫秒
long oneYearMills = 1L * 1000 * 60 * 60 * 24 * 365;
//算出最大可以多少年
System.out.println((maxTimeStamp - minTimeStamp) / oneYearMills);
}

所以,雪花算法生成的ID只能保證69年內不會重復,如果超過69年的話,那就考慮換個服務器(服務器ID)部署,并且要保證該服務器的ID和之前都沒有重復過。

前后端數值類型

在使用雪花算法時,由于生成的ID是64位,在傳遞給前端時,需要考慮以字符串的類型進行傳遞,否則可能會導致前端類型溢出,再回傳到服務器時已經變成另外一個值。

這是因為Number類型的ID在JS中最大只支持53位,直接將雪花算法的生成的ID傳遞給JS,會導致溢出。

小結

生成唯一性ID(其他數據)是幾乎在每個系統中都會有的場景,對其生成算法不僅要保證全局唯一性、趨勢遞增性,還要保證信息安全(比如被爬取數據),同時還要保證算法的高可用性(QPS、可行5個9、平均延時、TP999等指標)。這就對ID生成的算法有一定的要求,而雪花算法算是一個不錯的選擇。

但它也是有一定的缺點的,比如強依賴機器時鐘,如果機器上的時鐘回撥,會導致重復或服務不可用的問題,這也是我們在使用時需要注意的事項。


責任編輯:武曉燕 來源: 程序新視界
相關推薦

2019-09-05 13:06:08

雪花算法分布式ID

2024-02-02 10:57:12

Java分布式算法

2023-12-13 09:35:52

算法分布式

2023-12-12 07:13:39

雪花算法分布式ID

2020-07-21 11:35:21

開發技能代碼

2024-11-19 15:55:49

2021-06-28 14:45:07

分布式框架操作

2021-11-08 19:25:37

Go生成系統

2017-04-12 09:29:02

HiveMapReduceSpark

2025-09-16 07:00:00

雪花算法IDPython

2023-09-03 22:14:23

分布式ID

2017-07-01 16:02:39

分布式ID生成器

2021-06-05 07:33:09

ID分布式架構

2025-08-04 01:00:45

2024-10-31 13:51:58

2021-07-02 06:54:43

分布式環境ID

2023-01-12 17:46:37

分庫分表id如何生成

2016-11-29 09:12:21

數據庫分布式ID

2022-06-14 18:35:01

ID生成器語言

2022-01-27 10:06:29

生成算法分布式
點贊
收藏

51CTO技術棧公眾號

不卡精品视频| 精品人妻久久久久一区二区三区| 日本国产精品| 狠狠躁夜夜躁人人爽超碰91| 日本不卡一区二区三区在线观看| 懂色av蜜臀av粉嫩av喷吹| 婷婷综合视频| 精品免费国产二区三区| 国产在线青青草| 在线观看美女网站大全免费| 国产一区二区中文字幕| 国内免费精品永久在线视频| 在线观看免费视频黄| 成人自拍av| 亚洲精品第1页| 免费电影一区| 国产精品自偷自拍| 麻豆久久精品| 久久精品亚洲国产| 9.1成人看片免费版| 91精品一区| 欧美日韩中文在线| 日本老太婆做爰视频| 免费理论片在线观看播放老| 国产精品一级片| 国产精品69精品一区二区三区| 午夜爱爱毛片xxxx视频免费看| 日韩美女国产精品| 日韩视频一区二区在线观看| 亚洲精品高清无码视频| 国内高清免费在线视频| 国产精品久久久久久久浪潮网站| 久久er99热精品一区二区三区 | 午夜精品福利视频网站| 一区二区不卡在线观看| 色就是色亚洲色图| 成人午夜电影小说| 3d动漫啪啪精品一区二区免费 | 偷拍夫妻性生活| 大型av综合网站| 日韩欧美一级精品久久| www.色欧美| 日韩精选视频| 欧美性高潮在线| 欧美日韩不卡在线视频| 在线中文免费视频| 成人欧美一区二区三区白人 | 欧美日韩免费| 久久成人一区二区| 美国一级片在线观看| 欧美亚洲精品在线| 国产亚洲精品美女| 免费看黄色的视频| 中文字幕精品影院| 亚洲男人天堂视频| 丰满少妇高潮一区二区| 亚洲性视频大全| 亚洲乱亚洲乱妇无码| 亚洲黄色在线网站| 亚洲精品亚洲人成在线| 日韩精品免费在线视频观看| 国产又粗又长又爽| 无码日韩精品一区二区免费| 日韩精品欧美激情| japanese中文字幕| 精品视频免费| 中文字幕欧美专区| 久久精品三级视频| 91综合久久| 欧美成人午夜剧场免费观看| 国产高潮国产高潮久久久91| 午夜激情一区| 国内精品久久久久久久久| 日本午夜小视频| 亚洲天堂偷拍| 日本精品久久久久影院| 国产精品熟女视频| 九九视频精品免费| av在线不卡观看| 狠狠人妻久久久久久综合麻豆| 成人妖精视频yjsp地址| 久久久水蜜桃| 福利在线播放| 亚洲欧美日韩国产另类专区| 日韩欧美精品免费| 婷婷电影在线观看| 欧美这里有精品| 三级黄色片免费观看| 97久久亚洲| 亚洲国产精品va在看黑人| 欧美性xxxx图片| 欧美xxav| 97在线观看视频国产| 亚洲中文字幕无码爆乳av| 精品在线一区二区三区| 粉嫩高清一区二区三区精品视频 | 成人黄页在线观看| 奇米精品在线| 91麻豆免费在线视频| 精品久久久免费| 欧美日韩中文不卡| 久久精品色播| 日韩在线视频国产| 日本三级片在线观看| 青草国产精品久久久久久| 91久色国产| 福利在线播放| 午夜精品福利一区二区蜜股av| 激情视频免费网站| 黄色欧美网站| 久久九九精品99国产精品| 国产成人一区二区三区影院在线| 美女视频免费一区| 精品一区国产| av超碰免费在线| 欧洲亚洲国产日韩| 国产熟女高潮一区二区三区 | 国产成人永久免费视频| 你懂得影院夜精品a| 精品国产一区二区亚洲人成毛片| 丁香花五月婷婷| 亚洲精品乱码| 91亚洲精品丁香在线观看| 电影av一区| 五月婷婷综合在线| 亚洲综合在线一区二区| 狠狠做深爱婷婷综合一区| 91高清在线免费观看| 国产免费一区二区三区最新不卡 | 欧美三级华人主播| 丰满的护士2在线观看高清| 精品视频全国免费看| 国产三级视频网站| 1024日韩| 成人欧美一区二区三区视频 | 亚洲精品中文字幕在线观看| 中文字幕永久视频| 色综合综合色| 欧美在线播放视频| 天天射,天天干| 亚洲无人区一区| 国产精品99久久久精品无码| 欧美激情理论| 国产欧美久久一区二区| 二人午夜免费观看在线视频| 一本一本大道香蕉久在线精品| 国产伦精品一区三区精东| 欧美.日韩.国产.一区.二区| 成人免费在线视频网站| 日本最新在线视频| 777a∨成人精品桃花网| 美国一级片在线观看| 久久成人免费日本黄色| 亚洲制服中文| 亚洲精品69| 久久夜色精品国产亚洲aⅴ| 国产又粗又猛又爽又黄91| 国产精品美女久久久久久久久 | 91精品美女| 宅男66日本亚洲欧美视频| 欧美一区二区三区不卡视频| 久久久综合视频| 欧美黑人又粗又大又爽免费| av中文一区| 国产日韩欧美影视| h视频在线免费观看| 日韩亚洲欧美成人一区| 久久影院一区二区| 成人av电影免费在线播放| 每日在线观看av| 亚洲aa在线| 国产精品久久久久久久久久尿| 国产黄在线观看| 欧美日韩一级视频| 九九视频免费观看| 99在线视频精品| 国产精品99久久免费黑人人妻| 欧美中文一区二区| 91系列在线播放| 黑人玩欧美人三根一起进| 日韩av网站导航| 337p粉嫩色噜噜噜大肥臀| 国产精品久久久久久久久快鸭| 国产欧美激情视频| 亚洲激情欧美| 视频一区二区三| 日韩精品一级| 欧美在线免费观看| 97视频精彩视频在线观看| 欧美一区二区不卡视频| 色网站在线播放| 国产精品视频在线看| 欧美xxxx黑人| 久久先锋资源| 中国黄色录像片| 日韩欧美在线精品| 成人久久18免费网站图片| aa视频在线观看| 中文字幕亚洲欧美日韩2019| 性欧美18一19性猛交| 欧美视频免费在线观看| 色婷婷在线视频观看| 91麻豆免费观看| 婷婷激情小说网| 欧美亚洲免费| 亚洲中文字幕无码一区二区三区| 米奇777超碰欧美日韩亚洲| 91免费在线视频| 在线成人视屏| 国精产品一区一区三区有限在线| 尤物网在线观看| 亚洲黄色成人网| aaaa一级片| 欧美色精品天天在线观看视频| 日本三级中文字幕| 亚洲女女做受ⅹxx高潮| 精品人妻无码一区| k8久久久一区二区三区| 香蕉视频xxx| 美日韩一级片在线观看| 欧美日韩在线一| 欧美另类专区| 国产精品jizz在线观看老狼| 亚洲桃色综合影院| 精品无人区一区二区三区竹菊| 成人动漫视频在线观看| 国产极品精品在线观看| 日本不良网站在线观看| 欧美激情视频网| 黄色的网站在线观看| 夜夜嗨av色一区二区不卡| 亚洲日本国产精品| 亚洲а∨天堂久久精品9966| jizz中国女人| 欧美精品久久久久久久多人混战| 免费黄色片视频| 色诱亚洲精品久久久久久| 日韩特黄一级片| 亚洲第一精品在线| 精品一区二区三区人妻| 亚洲黄色免费网站| 成年人一级黄色片| 依依成人综合视频| 欧美日韩在线视频免费| 亚洲女厕所小便bbb| 人妻人人澡人人添人人爽| 国产精品麻豆99久久久久久| 在线观看免费黄色网址| 国产亲近乱来精品视频 | 欧美一级在线免费观看| 欧美电影免费提供在线观看| 99久久精品无免国产免费| 欧美日韩国产免费一区二区| 亚洲无码久久久久| 欧美精品1区2区| 国产片高清在线观看| 91精品国产91久久久久久一区二区 | 美女露出粉嫩尿囗让男人桶| 国产成人免费在线| 亚洲免费观看在线| www.在线成人| 国产全是老熟女太爽了| 日本一区二区视频在线观看| 亚洲天堂精品一区| 亚洲日本成人在线观看| 欧美又粗又大又长| 婷婷综合在线观看| 久久久久久久久久久影院| 色婷婷狠狠综合| 中文字幕久久久久| 欧美一区二区三区成人| 亚洲精品一区二区口爆| 精品在线小视频| melody高清在线观看| 久久夜色精品国产亚洲aⅴ| 欧美黑人猛交| 日韩av免费在线| 国产成人亚洲一区二区三区| 91精品久久久久久蜜桃| 久久免费视频66| 午夜免费电影一区在线观看| 亚洲高清影视| 一女被多男玩喷潮视频| 日韩高清不卡一区| 久久久久久国产精品日本| 91免费小视频| 99热99这里只有精品| 亚洲国产cao| 精品视频一二三区| 日韩欧美黄色影院| 黄色片视频在线观看| 久久亚洲精品视频| 男人天堂视频在线观看| 国产欧美日韩专区发布| 大奶一区二区三区| 亚洲一区美女| 国产精品久久久久毛片大屁完整版| 亚欧在线免费观看| 成人一道本在线| 国产精品一区二区亚洲| 欧美日韩另类字幕中文| 国产又粗又大又爽| 日韩精品视频在线观看免费| 在线观看免费版| 奇米4444一区二区三区| 日韩黄色av| 色乱码一区二区三在线看| 在线看片成人| 国产高清av片| 国产亚洲精品福利| 久久精品国产亚洲AV无码男同 | 日本亚洲不卡| 日韩video| 久久精品72免费观看| 日本japanese极品少妇| 亚洲欧美乱综合| 亚洲天堂中文网| 亚洲欧美www| 51漫画成人app入口| 成人午夜一级二级三级| 精品一区二区三区在线| 免费看毛片的网址| 国产精一品亚洲二区在线视频| 久操视频在线观看免费| 日韩欧美高清在线视频| 色欲久久久天天天综合网| 久久在线免费视频| 欧美v亚洲v综合v国产v仙踪林| 欧美性bbwbbwbbwhd| 99国产精品| 免费看毛片的网站| 一区二区高清在线| 国产美女www爽爽爽视频| 综合网中文字幕| 国产一区二区三区朝在线观看| 欧美极品视频一区二区三区| 一区在线视频| xxxx黄色片| 亚洲成av人片www| 欧美视频一二区| 久久人人爽人人| 成人av综合网| 僵尸世界大战2 在线播放| 国产成人精品影视| 免费一级全黄少妇性色生活片| 91精品国产乱码久久蜜臀| 国内精品不卡| 亚洲va欧美va国产综合久久| 国产精品久久久久蜜臀| 亚洲视频免费在线观看| 在线观看你懂的网站| 亚洲欧美中文日韩在线v日本| 在线黄色的网站| 裸模一区二区三区免费| 久久看片网站| 欧美人与性囗牲恔配| 欧美日韩小视频| 自拍视频在线| 成人a免费视频| 午夜精品av| 五月开心播播网| 色综合天天综合网国产成人综合天 | 精品综合久久久久久8888| 91久久久久久久久久久久久久| 欧美丰满少妇xxxxx高潮对白| 最新国产在线拍揄自揄视频| 成人自拍偷拍| 宅男噜噜噜66国产日韩在线观看| 女尊高h男高潮呻吟| 91高清视频在线| 麻豆视频在线观看免费| 成人久久18免费网站漫画| 99精品国产在热久久婷婷| av小说在线观看| 91超碰这里只有精品国产| 手机电影在线观看| 麻豆久久久9性大片| 奇米影视一区二区三区| 老妇女50岁三级| 亚洲精品一区二区网址 | 豆国产97在线| 免费精品视频| 国产精品中出一区二区三区| 国产成年精品| 免费毛片网站在线观看| 久久久久99精品国产片| 国产精品久久久久久久免费看 | 杨钰莹一级淫片aaaaaa播放| 精品国产乱码久久久久久夜甘婷婷| 牛牛精品一区二区| 中文字幕99| www.色综合.com| 中文字幕在线观看视频一区| 欧美黑人xxx| 国产精品一区二区av交换| 超碰中文字幕在线观看| 欧美性极品xxxx做受| 久久bbxx| 牛人盗摄一区二区三区视频| 国内精品不卡在线|