精品欧美一区二区三区在线观看 _久久久久国色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伊人久久| 亚洲精品日日夜夜| 久久精品日韩精品| 97人妻精品一区二区三区软件| 欧美在线资源| 亚洲精品国产成人| 男女男精品视频站| 国内在线视频| 国产欧美精品在线观看| 99在线热播| 久久精品五月天| 狠狠88综合久久久久综合网| 亚洲精品中文字幕av| 色一情一区二区三区| av日韩中文| 国产精品久久久久久久久久免费看| 成人情视频高清免费观看电影| av大片在线免费观看| 91精品国偷自产在线电影 | 凹凸av导航大全精品| 日本道精品一区二区三区| 永久免费在线看片视频| 天堂中文资源在线| 国产在线精品国自产拍免费| 国产成人精品视频在线观看| 久久精品这里只有精品| 欧美日韩色图| 精品亚洲精品福利线在观看| 国产成人强伦免费视频网站| 久久精品黄色| 91久久一区二区| 日本xxxxxxxxxx75| 成人在线网址| 国产精品久久久久久久久搜平片 | 水蜜桃久久夜色精品一区| 亚洲国产欧美一区二区三区久久| 激情成人在线观看| 777午夜精品电影免费看| 狠狠综合久久av一区二区小说| 国产精品12p| 国产精品四虎| 久久精品一区二区三区四区| 精品免费视频123区| 精品国产区一区二| 国产一区二区日韩精品| 国产日韩中文在线| 国产又粗又猛又爽又黄91| 奇米精品一区二区三区在线观看| 日韩美女写真福利在线观看| 亚洲天堂视频网站| 在线综合亚洲| 欧美一区二区.| www.中文字幕在线观看| 午夜一区在线| 日韩av大片免费看| 国产精品第5页| 久热精品视频| 国产精品爱啪在线线免费观看| 亚洲影院在线播放| 老鸭窝亚洲一区二区三区| 欧美在线一区二区视频| 成人在线免费看视频| 中文字幕精品无码亚| 亚洲三级精品| 亚洲人成网站在线播| 加勒比综合在线| 国内精品久久久久久久久电影网| 国产一区二区三区久久精品| 四虎地址8848| 欧美国产91| 午夜精品久久久久久久99热| 国产成人无码精品久在线观看| 一区二区日韩免费看| 国产经典一区二区| 在线观看av大片| 国产精品自拍网站| 国产女主播一区二区| 日韩av地址| 中文字幕av资源一区| 喜爱夜蒲2在线| 国产精品25p| 在线观看免费亚洲| 国产传媒免费观看| 动漫av一区| 亚洲人成自拍网站| 欧美丰满熟妇bbbbbb| 亚洲高清在线| 国产精品午夜国产小视频| 国产精品毛片久久久久久久av | 超碰人人cao| 欧美xxxx在线| 日韩中文第一页| www.youjizz.com亚洲| 性感少妇一区| 亚洲最大福利网站| 牛牛澡牛牛爽一区二区| 亚洲情趣在线观看| 国产肥臀一区二区福利视频| 日本免费成人| 亚洲精品午夜精品| 男女性高潮免费网站| 亚洲视频播放| 91夜夜揉人人捏人人添红杏| 亚洲日本在线播放| 亚洲品质自拍视频| 国产福利一区视频| 国产厕拍一区| 久青草国产97香蕉在线视频| 天天综合天天干| 国产盗摄女厕一区二区三区| 日韩精品最新在线观看| 国产在线拍揄自揄拍视频 | 欧美在线一级va免费观看| 国产精品无码自拍| 亚洲欧美日韩激情| 久久草av在线| 欧美中日韩免费视频| 日韩精品亚洲人成在线观看| 欧美影院精品一区| 色婷婷免费视频| 欧美精品自拍| 91免费国产网站| 粉嫩av一区| 欧美日韩亚洲激情| 久久久无码人妻精品无码| 首页国产精品| 国产精品国产自产拍高清av水多| 色香蕉在线视频| 亚洲一区二区三区免费视频| 欧美大片久久久| 成人免费看片39| 国产成人自拍视频在线观看| 涩涩视频免费看| 一区二区成人在线视频| 国产在线观看中文字幕| 日韩欧美一区二区三区在线视频| 欧美综合第一页| 五月婷婷在线观看视频| 亚洲午夜在线观看视频在线| 久久发布国产伦子伦精品| 99久久99久久精品国产片果冰| 国产精品91一区| 久香视频在线观看| 日本精品视频一区二区三区| 成人免费看aa片| 国产精品一二| 久久久久久久免费| 在线中文字幕播放| 亚洲另类欧美自拍| 日韩人妻精品中文字幕| 国产午夜精品一区二区三区嫩草| 青青草原av在线播放| 色综合综合色| 国产精品免费久久久久久| www.中文字幕久久久| 欧美午夜精品免费| 亚洲一二三四五六区| 国内一区二区视频| 女人色极品影院| 黄色网一区二区| 欧美在线视频免费| 成人影视在线播放| 在线播放/欧美激情| 亚洲天堂黄色片| 成人污视频在线观看| 精品视频在线观看一区| 亚洲国产合集| 国产精品久久视频| 国产调教视频在线观看| 欧美一级片免费看| 日本亚洲色大成网站www久久| 99久久久无码国产精品| 免费在线观看的毛片| 欧美韩国日本在线观看| 亚洲最大福利网站| 亚洲欧洲自拍| 母乳一区在线观看| 亚洲一区国产精品| 91豆花视频在线播放| 亚洲欧美另类在线观看| 亚洲一区二区三区网站| 一级特黄大欧美久久久| av无码av天天av天天爽| 精品一区二区影视| 男人天堂av片| 日韩在线精品| 国产精品区一区| 3d欧美精品动漫xxxx无尽| 久久亚洲欧美日韩精品专区| 天天舔天天干天天操| 欧美日韩在线三区| 国产性生活网站| 中文字幕乱码日本亚洲一区二区| 99国产精品免费视频| 视频一区二区国产| 国产女主播自拍| jiujiure精品视频播放| 动漫美女被爆操久久久| 电影亚洲一区| 亚洲3p在线观看| 日本a级在线| 国产视频精品久久久| 国产精品毛片久久久久久久av | 老熟妇一区二区三区| 亚洲免费观看视频| 亚洲色成人网站www永久四虎 | 中文字幕第4页| 国产黑丝在线一区二区三区| 99免费视频观看| 国产欧美高清| 欧美与动交zoz0z| 欧美理论在线播放| 精品一区二区久久久久久久网站| 国产精品亚洲四区在线观看| 国产97在线|亚洲| 日本高清成人vr专区| 中文字幕日韩欧美| 美国一级片在线免费观看视频| 日韩一区二区免费电影| 中日韩av在线| 日韩欧美亚洲范冰冰与中字| 五月天婷婷丁香| 亚洲免费观看高清在线观看| 亚洲一级理论片| 国产亚洲欧美日韩日本| 国产精品久久AV无码| 国产aⅴ精品一区二区三区色成熟| 视频二区在线播放| 日韩成人一级大片| www.xxx亚洲| 免费一区视频| 国产午夜福利视频在线观看| 亚洲二区在线| 黄色一级在线视频| 亚洲视频高清| 中文精品无码中文字幕无码专区| 天天综合精品| 一级黄色免费在线观看| 久久激情电影| 黄色成人在线播放| 免费观看一区二区三区| 国产精品综合在线视频| 福利视频999| 国产美女视频91| 欧洲美女亚洲激情| 国产一区二区三区在线观看免费 | a级网站在线观看| 婷婷六月综合| 免费久久久久久| 欧美二区视频| av在线免费观看国产| 欧美天堂亚洲电影院在线观看 | 久久一区二区三区四区五区| 男人揉女人奶房视频60分 | 亚洲精品乱码久久久久久动漫| 久久成人久久爱| 91pony九色| 国产99精品视频| 国产精品入口麻豆| 2020国产精品久久精品美国| 成人午夜福利一区二区| 亚洲国产成人午夜在线一区| 国产在视频线精品视频| 亚洲手机成人高清视频| 久久久久久久福利| 午夜欧美大尺度福利影院在线看 | 美女爽到呻吟久久久久| 国产精品亚洲二区在线观看| 日韩av一区二区三区四区| 亚洲一区二区三区四区五区xx| 蜜桃av噜噜一区| 中文字幕 欧美 日韩| 99在线精品视频| 日本成人免费视频| 综合电影一区二区三区 | 亚洲激情av| 国产免费人做人爱午夜视频| 极品美女销魂一区二区三区免费| 野花视频免费在线观看| 91在线你懂得| 亚洲色图27p| 亚洲制服欧美中文字幕中文字幕| 欧美日韩国产成人在线观看| 国产精品毛片一区二区三区四区| 久久精品国产成人| heyzo高清在线| 国产精品视频精品视频| 超碰成人在线观看| 日日噜噜噜噜夜夜爽亚洲精品| 女生裸体视频一区二区三区| 各处沟厕大尺度偷拍女厕嘘嘘| 紧缚捆绑精品一区二区| 天天躁日日躁狠狠躁av麻豆男男| 国产免费久久精品| 国产乡下妇女做爰| 欧美日韩成人一区二区| 免费观看国产精品| 精品国产欧美成人夜夜嗨| f2c人成在线观看免费视频| 国产欧美日韩中文字幕在线| 久久精品亚洲成在人线av网址| 亚洲精品乱码视频| aa级大片欧美三级| av在线网站免费观看| 国产欧美日韩激情| www.国产色| 欧美xfplay| 麻豆视频在线观看免费| 青青草国产精品一区二区| 一区二区三区亚洲变态调教大结局| 欧美综合激情| 影音先锋中文字幕一区| 国产精欧美一区二区三区白种人| 久久色在线观看| 国产精品成人久久| 69堂国产成人免费视频| 岛国最新视频免费在线观看| 性色av一区二区三区在线观看| 精品视频在线观看免费观看| 日韩精品国内| 亚洲中午字幕| 麻豆精品国产传媒av| 一区二区高清在线| 国产高清不卡视频| 日韩中文字幕在线观看| 亚洲精品国产嫩草在线观看| 国产中文一区二区| 伊人久久成人| xxxx视频在线观看| 尤物av一区二区| 国产欧美一区二区三区视频在线观看 | 99精品视频在线看| 99国产麻豆精品| 日本少妇xxxx动漫| 亚洲成人中文字幕| 人人超在线公开视频| 97久草视频| 欧美精品1区| 亚洲v在线观看| 亚洲尤物视频在线| 亚洲毛片欧洲毛片国产一品色| 久久影院资源网| 欧洲一区在线| 肉大捧一出免费观看网站在线播放| 国产一区二区电影| 精品无码久久久久成人漫画| 6080日韩午夜伦伦午夜伦| 精品国产白色丝袜高跟鞋| 91亚洲精华国产精华| 中文字幕一区二区三区乱码图片 | 久久综合丝袜日本网| 亚洲黄色一区二区| 精品亚洲一区二区三区在线观看 | 免费视频一二三区| 欧美一区二区三区思思人| aa在线视频| 国产不卡一区二区在线观看| 欧美色图首页| 折磨小男生性器羞耻的故事| 亚洲国产日韩综合久久精品| 少妇无码一区二区三区| 青青青国产精品一区二区| 欧美日韩激情在线一区二区三区| 免费看污污网站| 一区二区三区四区高清精品免费观看| 丰满岳乱妇国产精品一区| 91高清视频免费| 精品一区二区三| 免费黄频在线观看| 天天影视色香欲综合网老头| 国产综合视频一区二区三区免费| 国产精品一区久久久| 欧美日本国产| 在线免费观看麻豆| 欧美丰满少妇xxxxx高潮对白| 免费不卡av| 欧洲亚洲一区| 国产精品亚洲一区二区三区妖精| www.天天色| 中文字幕日韩在线视频| 97青娱国产盛宴精品视频| 噜噜噜久久亚洲精品国产品麻豆 | 国产精品suv一区二区69| 亚洲欧美自拍一区| 日本99精品| 99999精品视频| 亚洲精品老司机| 邻居大乳一区二区三区| 51成人做爰www免费看网站| 国产欧美在线| 亚洲 欧美 变态 另类 综合| 日韩av影片在线观看| 9999精品视频| 北条麻妃av高潮尖叫在线观看| 亚洲人精品一区| 国产区av在线| 国产伦精品一区二区三区高清 |