溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

雪花算法(01)介紹

發(fā)布時間:2020-08-08 17:55:39 來源:網(wǎng)絡(luò) 閱讀:1224 作者:小布哥哥s 欄目:編程語言

針對每個公司,隨著服務(wù)化演進(jìn),單個服務(wù)越來越多,數(shù)據(jù)庫分的越來越細(xì),有的時候一個業(yè)務(wù)需要分成好幾個庫,這時候自增主鍵或者序列之類的主鍵id生成方式已經(jīng)不再滿足需求,分布式系統(tǒng)中需要的是一個全局唯一的id生成規(guī)則。既然號稱在全局分布式系統(tǒng)中唯一,那么主鍵的生成規(guī)則必然要復(fù)雜一些,以前看過很多資料,都對雪花的生成一知半解,最后才發(fā)現(xiàn)是對Java的位運(yùn)算沒有徹底了解,這里想針對雪花算法,以一種淺顯的的方式來進(jìn)行學(xué)習(xí),去除以前的一知半解和對雪花算法的神秘感。

雪花算法生成的最終結(jié)果其實就是一個long類型的Java長整型數(shù)字,這是一個大前提!算法所有的內(nèi)容都是針對這個數(shù)字進(jìn)行運(yùn)算的。Java基礎(chǔ)類型相信都很熟悉,有32位的整型int類型,和64位的長整型long類型。我們單說long類型,64位說的是數(shù)字轉(zhuǎn)換為二進(jìn)制形式時候的表現(xiàn),其中第一位表示的是正負(fù),也就是符號,剩下的63位表示的是字面數(shù)字。我們來簡單看一下幾個關(guān)鍵的long數(shù)字轉(zhuǎn)換成二進(jìn)制的形式:
雪花算法(01)介紹

再來看一個二進(jìn)制數(shù)字轉(zhuǎn)換為long類型:

雪花算法(01)介紹

上面都是Java基礎(chǔ)知識,相信大家都懂。

生成一個long類型的數(shù)字id,其實就是對這64位的二進(jìn)制形式里面填值,把這64位分成幾個部分,彼此間互不影響,每部分都有自己的生成規(guī)則,這樣在一定的簡單的大前提下,能保證全局唯一。

先說第一位,long類型的數(shù)字是有符號的,第一位是0就是正數(shù),1是負(fù)數(shù),我們生成的id必然要正數(shù),所以第一位可以確定為0不變。

剩下的63位分成三大部分,第一部分占41位,用來表示時間,什么時間后面會詳細(xì)介紹。第二部分占10位,用來表示程序所在機(jī)器的信息,剩下的第三部分占12位,填充的是一個序列,可以理解為遞增數(shù)字,這樣前面的時間和機(jī)器數(shù)字如果都一樣的話,用序列的區(qū)別來生成不同的id。

雪花算法(01)介紹

上面的三大塊信息轉(zhuǎn)換成數(shù)字,填充到63位當(dāng)中,基本可以保證任何時間任何機(jī)器生產(chǎn)的任何id不重復(fù),可以推理出,時間和序列都是不可控的,但是機(jī)器信息是我們可以控制的,也就是說設(shè)置好機(jī)器信息是分布式id不重復(fù)的關(guān)鍵。

根據(jù)上面的理論可以開始學(xué)習(xí)雪花算法。

代碼地址:https://gitee.com/blueses/snowflake-demo 01

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI