日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java實(shí)現(xiàn)Twitter的分布式自增ID算法snowflake

瀏覽:6日期:2022-08-26 09:21:22

概述

分布式系統(tǒng)中,有一些需要使用全局唯一ID的場景,這種時(shí)候?yàn)榱朔乐笽D沖突可以使用36位的UUID,但是UUID有一些缺點(diǎn),首先他相對比較長,另外UUID一般是無序的。

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

而twitter的snowflake解決了這種需求,最初Twitter把存儲系統(tǒng)從MySQL遷移到Cassandra,因?yàn)镃assandra沒有順序ID生成機(jī)制,所以開發(fā)了這樣一套全局唯一ID生成服務(wù)。

結(jié)構(gòu)

snowflake的結(jié)構(gòu)如下(每部分用-分開):

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

第一位為未使用,接下來的41位為毫秒級時(shí)間(41位的長度可以使用69年),然后是5位datacenterId和5位workerId(10位的長度最多支持部署1024個(gè)節(jié)點(diǎn)) ,最后12位是毫秒內(nèi)的計(jì)數(shù)(12位的計(jì)數(shù)順序號支持每個(gè)節(jié)點(diǎn)每毫秒產(chǎn)生4096個(gè)ID序號)

一共加起來剛好64位,為一個(gè)Long型。(轉(zhuǎn)換成字符串后長度最多19)

snowflake生成的ID整體上按照時(shí)間自增排序,并且整個(gè)分布式系統(tǒng)內(nèi)不會產(chǎn)生ID碰撞(由datacenter和workerId作區(qū)分),并且效率較高。經(jīng)測試snowflake每秒能夠產(chǎn)生26萬個(gè)ID。

源碼

(JAVA版本的源碼)

/** * Twitter_Snowflake<br> * SnowFlake的結(jié)構(gòu)如下(每部分用-分開):<br> * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br> * 1位標(biāo)識,由于long基本類型在Java中是帶符號的,最高位是符號位,正數(shù)是0,負(fù)數(shù)是1,所以id一般是正數(shù),最高位是0<br> * 41位時(shí)間截(毫秒級),注意,41位時(shí)間截不是存儲當(dāng)前時(shí)間的時(shí)間截,而是存儲時(shí)間截的差值(當(dāng)前時(shí)間截 - 開始時(shí)間截) * 得到的值),這里的的開始時(shí)間截,一般是我們的id生成器開始使用的時(shí)間,由我們程序來指定的(如下下面程序IdWorker類的startTime屬性)。41位的時(shí)間截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br> * 10位的數(shù)據(jù)機(jī)器位,可以部署在1024個(gè)節(jié)點(diǎn),包括5位datacenterId和5位workerId<br> * 12位序列,毫秒內(nèi)的計(jì)數(shù),12位的計(jì)數(shù)順序號支持每個(gè)節(jié)點(diǎn)每毫秒(同一機(jī)器,同一時(shí)間截)產(chǎn)生4096個(gè)ID序號<br> * 加起來剛好64位,為一個(gè)Long型。<br> * SnowFlake的優(yōu)點(diǎn)是,整體上按照時(shí)間自增排序,并且整個(gè)分布式系統(tǒng)內(nèi)不會產(chǎn)生ID碰撞(由數(shù)據(jù)中心ID和機(jī)器ID作區(qū)分),并且效率較高,經(jīng)測試,SnowFlake每秒能夠產(chǎn)生26萬ID左右。 */public class SnowflakeIdWorker { // ==============================Fields=========================================== /** 開始時(shí)間截 (2015-01-01) */ private final long twepoch = 1420041600000L; /** 機(jī)器id所占的位數(shù) */ private final long workerIdBits = 5L; /** 數(shù)據(jù)標(biāo)識id所占的位數(shù) */ private final long datacenterIdBits = 5L; /** 支持的最大機(jī)器id,結(jié)果是31 (這個(gè)移位算法可以很快的計(jì)算出幾位二進(jìn)制數(shù)所能表示的最大十進(jìn)制數(shù)) */ private final long maxWorkerId = -1L ^ (-1L << workerIdBits); /** 支持的最大數(shù)據(jù)標(biāo)識id,結(jié)果是31 */ private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); /** 序列在id中占的位數(shù) */ private final long sequenceBits = 12L; /** 機(jī)器ID向左移12位 */ private final long workerIdShift = sequenceBits; /** 數(shù)據(jù)標(biāo)識id向左移17位(12+5) */ private final long datacenterIdShift = sequenceBits + workerIdBits; /** 時(shí)間截向左移22位(5+5+12) */ private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; /** 生成序列的掩碼,這里為4095 (0b111111111111=0xfff=4095) */ private final long sequenceMask = -1L ^ (-1L << sequenceBits); /** 工作機(jī)器ID(0~31) */ private long workerId; /** 數(shù)據(jù)中心ID(0~31) */ private long datacenterId; /** 毫秒內(nèi)序列(0~4095) */ private long sequence = 0L; /** 上次生成ID的時(shí)間截 */ private long lastTimestamp = -1L; //==============================Constructors===================================== /** * 構(gòu)造函數(shù) * @param workerId 工作ID (0~31) * @param datacenterId 數(shù)據(jù)中心ID (0~31) */ public SnowflakeIdWorker(long workerId, long datacenterId) { if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException(String.format('worker Id can’t be greater than %d or less than 0', maxWorkerId)); } if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException(String.format('datacenter Id can’t be greater than %d or less than 0', maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } // ==============================Methods========================================== /** * 獲得下一個(gè)ID (該方法是線程安全的) * @return SnowflakeId */ public synchronized long nextId() { long timestamp = timeGen(); //如果當(dāng)前時(shí)間小于上一次ID生成的時(shí)間戳,說明系統(tǒng)時(shí)鐘回退過這個(gè)時(shí)候應(yīng)當(dāng)拋出異常 if (timestamp < lastTimestamp) { throw new RuntimeException( String.format('Clock moved backwards. Refusing to generate id for %d milliseconds', lastTimestamp - timestamp)); } //如果是同一時(shí)間生成的,則進(jìn)行毫秒內(nèi)序列 if (lastTimestamp == timestamp) { sequence = (sequence + 1) & sequenceMask; //毫秒內(nèi)序列溢出 if (sequence == 0) {//阻塞到下一個(gè)毫秒,獲得新的時(shí)間戳timestamp = tilNextMillis(lastTimestamp); } } //時(shí)間戳改變,毫秒內(nèi)序列重置 else { sequence = 0L; } //上次生成ID的時(shí)間截 lastTimestamp = timestamp; //移位并通過或運(yùn)算拼到一起組成64位的ID return ((timestamp - twepoch) << timestampLeftShift) //| (datacenterId << datacenterIdShift) //| (workerId << workerIdShift) //| sequence; } /** * 阻塞到下一個(gè)毫秒,直到獲得新的時(shí)間戳 * @param lastTimestamp 上次生成ID的時(shí)間截 * @return 當(dāng)前時(shí)間戳 */ protected long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } /** * 返回以毫秒為單位的當(dāng)前時(shí)間 * @return 當(dāng)前時(shí)間(毫秒) */ protected long timeGen() { return System.currentTimeMillis(); } //==============================Test============================================= /** 測試 */ public static void main(String[] args) { SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0); for (int i = 0; i < 1000; i++) { long id = idWorker.nextId(); System.out.println(Long.toBinaryString(id)); System.out.println(id); } }}

參考

https://github.com/twitter/snowflake

到此這篇關(guān)于Java實(shí)現(xiàn)Twitter的分布式自增ID算法snowflake的文章就介紹到這了,更多相關(guān)Java 自增ID算法snowflake內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品乱码| 欧美亚洲自偷自偷| 精品亚洲美女网站| 午夜久久中文| 欧美~级网站不卡| 免播放器亚洲| 日本成人中文字幕在线视频| 日韩精品免费视频人成| 国产欧美日韩影院| 色综合五月天| 亚洲激情另类| 日韩精品电影一区亚洲| 久久av偷拍| 在线天堂资源www在线污| 99精品在线观看| 亚洲不卡视频| 中文字幕在线看片| 午夜在线视频一区二区区别| 国产欧美另类| 99精品在线观看| 亚洲乱亚洲高清| 国内不卡的一区二区三区中文字幕| 天堂а√在线最新版中文在线| 亚洲一区二区三区高清| 国产精品jk白丝蜜臀av小说| 亚洲不卡av不卡一区二区| 亚洲一区二区三区四区电影| 国产伦理一区| 午夜av成人| 日韩一区二区三区精品视频第3页| 老色鬼精品视频在线观看播放| 久久精品一区二区不卡| 亚洲精品亚洲人成在线观看| 精品一区二区三区免费看| 精品中文一区| 亚洲午夜一级| 国产精品一二| 亚洲精品一区二区妖精| 国产精品亚洲一区二区在线观看| 99热精品久久| 麻豆久久久久久| 老司机精品久久| 激情综合五月| 天堂精品久久久久| 91精品国产91久久久久久黑人| 91精品国产自产精品男人的天堂| 韩国精品主播一区二区在线观看 | 久久国产中文字幕| 日韩精品高清不卡| 一区在线免费| 在线亚洲人成| 国产精品一卡| 亚洲三级国产| 精品欧美一区二区三区在线观看| 日韩免费精品| 亚洲神马久久| 成人在线网站| 精品三级国产| 日韩在线黄色| 在线亚洲国产精品网站| 青青青免费在线视频| 国产视频一区二| 亚洲一区二区三区中文字幕在线观看| 少妇精品导航| 日韩伦理在线一区| 久久精品系列| 国产精品一卡| 日本天堂一区| 亚洲制服少妇| 亚洲精品888| 99视频精品全部免费在线视频| 久久久久久夜| 精品一区91| 麻豆高清免费国产一区| 国产精品欧美大片| 婷婷视频一区二区三区| 尤物网精品视频| 在线日韩欧美| 亚洲二区免费| 欧美日韩在线播放视频| 在线一区av| 国产福利片在线观看| 麻豆91小视频| 国产精品一区免费在线| 日韩av网站在线免费观看| 综合激情视频| 日韩在线卡一卡二| 人人精品人人爱| 视频一区二区三区在线| 国产视频一区三区| 亚洲综合国产| 首页国产欧美久久| 丝袜美腿亚洲色图| 久久香蕉精品| 美美哒免费高清在线观看视频一区二区| 免费观看不卡av| 蜜臀av免费一区二区三区| 亚洲天堂久久| av亚洲在线观看| 99re国产精品| 免费在线视频一区| 日韩不卡在线观看日韩不卡视频| 欧美在线精品一区| 国产精品高潮呻吟久久久久| 丁香婷婷久久| 日韩另类视频| 伊人久久成人| 亚洲精品一二| 国产欧美久久一区二区三区| 精品国产一区二| 久久婷婷亚洲| 六月婷婷一区| 青草国产精品| 欧美激情视频一区二区三区在线播放| 国产精品s色| 日韩电影免费网址| 国产视频一区三区| 91伊人久久| 国产成人免费| 国产韩日影视精品| 综合在线一区| 鲁大师精品99久久久| 精品成人免费一区二区在线播放| 亚洲黄页一区| 青青国产精品| 日韩在线高清| 亚洲精品亚洲人成在线观看| 欧美国产视频| 欧美 日韩 国产一区二区在线视频 | 欧美性感美女一区二区| 在线亚洲观看| 国产精品亚洲产品| 欧洲一级精品| 亚州精品视频| 激情国产在线| 亚洲精品日本| 蜜桃av在线播放| 蜜臀av一区二区三区| 国产精区一区二区| 久久精品国产大片免费观看| 婷婷成人av| 蜜臀久久精品| 日韩中文一区二区| 国产日韩欧美高清免费| 久久中文字幕av| 国产精品午夜一区二区三区| 极品裸体白嫩激情啪啪国产精品| 青青草伊人久久| 亚洲国产专区| 麻豆精品国产91久久久久久| 国产美女精品| www.51av欧美视频| 日韩中文字幕亚洲一区二区va在线 | 麻豆高清免费国产一区| 日韩一级网站| 国产极品嫩模在线观看91精品| 九色精品91| 久草精品视频| 日韩欧美高清一区二区三区| 日韩欧美午夜| 国产精品久久久久久久久久久久久久久 | 国产精品欧美日韩一区| 在线一区免费观看| 最新中文字幕在线播放 | 日精品一区二区三区| 精精国产xxxx视频在线播放| 日本色综合中文字幕| 国产亚洲永久域名| 国产成人免费| 国产精品入口久久| 亚洲精品婷婷| 日韩亚洲精品在线| 日韩一区二区三区免费播放| 国产欧美一区二区色老头| 性色一区二区| 久久在线免费| 亚洲午夜天堂| 精品欧美日韩精品| 国产日韩在线观看视频| 亚洲色图国产| 欧美精品自拍| 日韩高清中文字幕一区二区| 国产亚洲一区二区三区啪| 亚洲欧美专区| 蜜桃免费网站一区二区三区| 91久久久精品国产| 久久狠狠婷婷| 日韩成人三级| 欧美二三四区| 91看片一区| 日韩另类视频| 亚洲日本网址| 成人免费电影网址| 久久精品资源| 成人国产精品| 久久精品人人| 久久99影视| 精品国产成人| 精品国产免费人成网站| 日韩成人精品一区|