摘要:前面的理論基礎(chǔ)和位運(yùn)算都了解了,下面我們來(lái)生成雪花算法的第一部分,也就是時(shí)間部分。這個(gè)時(shí)候就有一個(gè)問(wèn)題了,如果我們系統(tǒng)的時(shí)鐘錯(cuò)了會(huì)不會(huì)有問(wèn)題會(huì)所以要做判斷而且系統(tǒng)的時(shí)鐘錯(cuò)誤也是雪花算法的一個(gè)致命問(wèn)題,所以要一定要保證服務(wù)器的系統(tǒng)時(shí)間正確。
前面的理論基礎(chǔ)和位運(yùn)算都了解了,下面我們來(lái)生成雪花算法的第一部分,也就是時(shí)間部分。時(shí)間部分的邏輯起始很簡(jiǎn)單,就是規(guī)定一個(gè)起始時(shí)間戳,然后用當(dāng)前時(shí)間戳減去起始時(shí)間戳,這兩個(gè)數(shù)的差就是我們要的結(jié)果。簡(jiǎn)單看一下代碼邏輯:
我們規(guī)定的起始時(shí)間是 2015-01-01 00:00:00 ,然后獲取當(dāng)前時(shí)間,用當(dāng)前時(shí)間減去起始時(shí)間,就是我們要的時(shí)間部分的數(shù)值。這個(gè)時(shí)候就有一個(gè)問(wèn)題了,如果我們系統(tǒng)的時(shí)鐘錯(cuò)了會(huì)不會(huì)有問(wèn)題?會(huì)!所以要做判斷!而且系統(tǒng)的時(shí)鐘錯(cuò)誤也是雪花算法的一個(gè)致命問(wèn)題,所以要一定要保證服務(wù)器的系統(tǒng)時(shí)間正確。來(lái)看一下對(duì)時(shí)間戳的判斷:
定義了一個(gè)變量LAST_TIME_STAMP記為上次id的生成時(shí)間,每次生成都標(biāo)記一下,所以這個(gè)時(shí)間一定是遞增的,如果系統(tǒng)時(shí)鐘除了問(wèn)題,那么直接報(bào)異常。這是對(duì)系統(tǒng)時(shí)間錯(cuò)誤的一個(gè)判斷和處理。
就這樣時(shí)間部分就生成了,現(xiàn)在看看還是很簡(jiǎn)單的。現(xiàn)在我們?cè)賮?lái)看雪花算法的時(shí)間范圍,由于時(shí)間共占有41位,所以時(shí)間的數(shù)字范圍是有一個(gè)最大值的,寫(xiě)成2進(jìn)制就是41個(gè)1,比如我們的起始時(shí)間是2015-01-01 00:00:00,時(shí)間戳是1420041600000L,把41個(gè)1轉(zhuǎn)換成long類型數(shù)字,再加上這個(gè)時(shí)間戳數(shù)字,就是一個(gè)雪花算法最終的時(shí)間戳,轉(zhuǎn)換成時(shí)間就是2084-09-06 15:47:35,也就是這個(gè)41位時(shí)間的雪花算法最長(zhǎng)使用69年9個(gè)月6天零15小時(shí)47分35秒,不過(guò)對(duì)于一個(gè)項(xiàng)目來(lái)說(shuō),這樣的限制不算限制,足足的夠用了。
代碼地址:https://gitee.com/blueses/snowflake-demo 03
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/76133.html
摘要:雪花算法生成的最終結(jié)果其實(shí)就是一個(gè)類型的長(zhǎng)整型數(shù)字,這是一個(gè)大前提算法所有的內(nèi)容都是針對(duì)這個(gè)數(shù)字進(jìn)行運(yùn)算的。根據(jù)上面的理論可以開(kāi)始學(xué)習(xí)雪花算法。 針對(duì)每個(gè)公司,隨著服務(wù)化演進(jìn),單個(gè)服務(wù)越來(lái)越多,數(shù)據(jù)庫(kù)分的越來(lái)越細(xì),有的時(shí)候一個(gè)業(yè)務(wù)需要分成好幾個(gè)庫(kù),這時(shí)候自增主鍵或者序列之類的主鍵id生成方式已經(jīng)不再滿足需求,分布式系統(tǒng)中需要的是一個(gè)全局唯一的id生成規(guī)則。既然號(hào)稱在全局分布式系統(tǒng)中唯一...
摘要:前面的內(nèi)容把雪花算法的時(shí)間部分和機(jī)器信息部分都生成了,下面來(lái)生成最后一部分,就是毫秒內(nèi)的序列。這樣毫秒內(nèi)的序列數(shù)就算獲取成功了。 前面的內(nèi)容把雪花算法的時(shí)間部分和機(jī)器信息部分都生成了,下面來(lái)生成最后一部分,就是毫秒內(nèi)的序列。什么意思呢?我們?cè)谏蓵r(shí)間部分獲取時(shí)間戳的時(shí)候,使用 long now = System.currentTimeMillis(); 獲取,是個(gè)毫秒級(jí)的時(shí)間戳,但是即...
摘要:原理的雪花算法,使用語(yǔ)言實(shí)現(xiàn)。生成的整體上按照時(shí)間自增排序,并且整個(gè)分布式系統(tǒng)內(nèi)不會(huì)產(chǎn)生碰撞由和作區(qū)分,并且效率較高。據(jù)說(shuō)每秒能夠產(chǎn)生萬(wàn)個(gè)。 分布式系統(tǒng)中,有一些需要使用全局唯一ID的場(chǎng)景,這種時(shí)候?yàn)榱朔乐笽D沖突可以使用36位的UUID,但是UUID有一些缺點(diǎn),首先他相對(duì)比較長(zhǎng),另外UUID一般是無(wú)序的。 有些時(shí)候我們希望能使用一種簡(jiǎn)單一些的ID,并且希望ID能夠按照時(shí)間有序生成。 ...
摘要:雪花算法初步完成后,我們討論了幾個(gè)位運(yùn)算的寫(xiě)法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機(jī)器占多少位,或者時(shí)間向左位移多少,這些在算法具體邏輯確定后就不會(huì)變了。 雪花算法初步完成后,我們討論了幾個(gè)位運(yùn)算的寫(xiě)法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機(jī)器占多少位,或者時(shí)間向左位移多少,這些在算法具體邏輯確定后就不會(huì)變了。那么寫(xiě)成最后的數(shù)字和用位運(yùn)算計(jì)算出來(lái)有什么...
摘要:有些時(shí)候我們希望能使用一種簡(jiǎn)單一些的,并且希望能夠按照時(shí)間有序生成。轉(zhuǎn)換成字符串后長(zhǎng)度最多生成的整體上按照時(shí)間自增排序,并且整個(gè)分布式系統(tǒng)內(nèi)不會(huì)產(chǎn)生碰撞由和作區(qū)分,并且效率較高。經(jīng)測(cè)試每秒能夠產(chǎn)生萬(wàn)個(gè)。 概述 分布式系統(tǒng)中,有一些需要使用全局唯一ID的場(chǎng)景,這種時(shí)候?yàn)榱朔乐笽D沖突可以使用36位的UUID,但是UUID有一些缺點(diǎn),首先他相對(duì)比較長(zhǎng),另外UUID一般是無(wú)序的。 有些時(shí)候我...
閱讀 2888·2021-11-17 09:33
閱讀 3661·2021-11-16 11:42
閱讀 3488·2021-10-26 09:50
閱讀 1316·2021-09-22 15:49
閱讀 3045·2021-08-10 09:44
閱讀 3669·2019-08-29 18:36
閱讀 3924·2019-08-29 16:43
閱讀 2207·2019-08-29 14:10