摘要:前面的內(nèi)容把雪花算法的時間部分和機器信息部分都生成了,下面來生成最后一部分,就是毫秒內(nèi)的序列。這樣毫秒內(nèi)的序列數(shù)就算獲取成功了。
前面的內(nèi)容把雪花算法的時間部分和機器信息部分都生成了,下面來生成最后一部分,就是毫秒內(nèi)的序列。什么意思呢?我們在生成時間部分獲取時間戳的時候,使用 long now = System.currentTimeMillis(); 獲取,是個毫秒級的時間戳,但是即使是這么短的時間,對于電腦來說也足夠生成很多個id,所以很多id可能會在同一個毫秒內(nèi)生成,也就是時間部分的數(shù)值一樣。這個時候就要讓同一個毫秒內(nèi)生成的id加上數(shù)字序列標(biāo)識,就是第三部分的序列。第三部分占的長度是12位,轉(zhuǎn)成整數(shù)值就是4095,所以最后一部分的范圍就是4095到0之間的數(shù)字。如果毫秒內(nèi)訪問的數(shù)量超過了這個限制怎么辦?沒法解決,只能強制等到下一毫秒再生產(chǎn)id。這就是第三部分的作用。
下面先定義一個序列初始值:
序列由于和時間戳有關(guān)系,所以要加載時間戳真正開始使用之前:
上面的邏輯做了判斷,同一毫秒內(nèi)就讓序列加1,超過4095,就強制獲取下一毫秒的值,等時間戳不是同一毫秒的時候,序列從新開始計算??聪氯绾螐娭偏@取下一毫秒:
簡單粗暴,就是while循環(huán)等下一毫秒就可以。這樣毫秒內(nèi)的序列數(shù)就算獲取成功了。
我們?nèi)蟛糠值臄?shù)字都獲取成功了,最后直接位移加合并就行:
這樣雪花算法就寫完了,下面執(zhí)行一下測試:
是一個18位的long類型數(shù)字,確實是我們要的結(jié)果。等等!是不是有問題?如果此時多個線程訪問,會產(chǎn)生重復(fù)的id!現(xiàn)在的程序確實有多并發(fā)問題,需要加上鎖:
這樣我們的雪花算法算是初步完成了?;疽卜享椖繉ξㄒ籭d的要求!現(xiàn)在的寫法和網(wǎng)上的例子還有些差別,下面我們講講差別相關(guān)的內(nèi)容。
代碼地址:https://gitee.com/blueses/sno... 05
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/76147.html
摘要:雪花算法初步完成后,我們討論了幾個位運算的寫法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機器占多少位,或者時間向左位移多少,這些在算法具體邏輯確定后就不會變了。 雪花算法初步完成后,我們討論了幾個位運算的寫法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機器占多少位,或者時間向左位移多少,這些在算法具體邏輯確定后就不會變了。那么寫成最后的數(shù)字和用位運算計算出來有什么...
摘要:序本文主要來聊聊分布式的生成方案。分布式的生成,以為代表的,系列算法采用的就是劃分命名空間并行生成的思路。 序 本文主要來聊聊分布式id的生成方案。 目標(biāo) 業(yè)務(wù)系統(tǒng)需要什么樣的ID生成器中提出了幾點目標(biāo): 唯一性 時間相關(guān) 粗略有序 可反解 可制造 主要思路 對于每個標(biāo)識,都需要有一個命名空間(namespace),來保證其相對唯一性。分布式的ID生成,以Twitter Snowf...
摘要:關(guān)于我為什么寫這篇文章是因為今天在做訂單模塊的時候看到之前的上描述的年月日用戶位企業(yè)位四位自增長數(shù)。背景對于其定訂單的生成。個人的看法是主要是唯一,其他關(guān)于業(yè)務(wù)方面的不是太太重要。自增實現(xiàn)了用于將的值遞增,并返回結(jié)果。 關(guān)于我為什么寫這篇文章是因為今天在做訂單模塊的時候,看到之前的PRD上描述的年月日+用戶id2位+企業(yè)id位+四位自增長數(shù)。然后竟被我反駁的突然改成了精確時間+4位自增...
摘要:有些時候我們希望能使用一種簡單一些的,并且希望能夠按照時間有序生成。轉(zhuǎn)換成字符串后長度最多生成的整體上按照時間自增排序,并且整個分布式系統(tǒng)內(nèi)不會產(chǎn)生碰撞由和作區(qū)分,并且效率較高。經(jīng)測試每秒能夠產(chǎn)生萬個。 概述 分布式系統(tǒng)中,有一些需要使用全局唯一ID的場景,這種時候為了防止ID沖突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。 有些時候我...
摘要:雪花算法生成的最終結(jié)果其實就是一個類型的長整型數(shù)字,這是一個大前提算法所有的內(nèi)容都是針對這個數(shù)字進行運算的。根據(jù)上面的理論可以開始學(xué)習(xí)雪花算法。 針對每個公司,隨著服務(wù)化演進,單個服務(wù)越來越多,數(shù)據(jù)庫分的越來越細,有的時候一個業(yè)務(wù)需要分成好幾個庫,這時候自增主鍵或者序列之類的主鍵id生成方式已經(jīng)不再滿足需求,分布式系統(tǒng)中需要的是一個全局唯一的id生成規(guī)則。既然號稱在全局分布式系統(tǒng)中唯一...
閱讀 924·2021-09-22 15:18
閱讀 1306·2021-09-09 09:33
閱讀 2850·2019-08-30 10:56
閱讀 1349·2019-08-29 16:30
閱讀 1582·2019-08-29 13:02
閱讀 1543·2019-08-26 13:55
閱讀 1773·2019-08-26 13:41
閱讀 2067·2019-08-26 11:56