摘要:雪花算法生成的最終結(jié)果其實(shí)就是一個(gè)類型的長(zhǎng)整型數(shù)字,這是一個(gè)大前提算法所有的內(nèi)容都是針對(duì)這個(gè)數(shù)字進(jìn)行運(yùn)算的。根據(jù)上面的理論可以開始學(xué)習(xí)雪花算法。
針對(duì)每個(gè)公司,隨著服務(wù)化演進(jìn),單個(gè)服務(wù)越來越多,數(shù)據(jù)庫分的越來越細(xì),有的時(shí)候一個(gè)業(yè)務(wù)需要分成好幾個(gè)庫,這時(shí)候自增主鍵或者序列之類的主鍵id生成方式已經(jīng)不再滿足需求,分布式系統(tǒng)中需要的是一個(gè)全局唯一的id生成規(guī)則。既然號(hào)稱在全局分布式系統(tǒng)中唯一,那么主鍵的生成規(guī)則必然要復(fù)雜一些,以前看過很多資料,都對(duì)雪花的生成一知半解,最后才發(fā)現(xiàn)是對(duì)Java的位運(yùn)算沒有徹底了解,這里想針對(duì)雪花算法,以一種淺顯的的方式來進(jìn)行學(xué)習(xí),去除以前的一知半解和對(duì)雪花算法的神秘感。
雪花算法生成的最終結(jié)果其實(shí)就是一個(gè)long類型的Java長(zhǎng)整型數(shù)字,這是一個(gè)大前提!算法所有的內(nèi)容都是針對(duì)這個(gè)數(shù)字進(jìn)行運(yùn)算的。Java基礎(chǔ)類型相信都很熟悉,有32位的整型int類型,和64位的長(zhǎng)整型long類型。我們單說long類型,64位說的是數(shù)字轉(zhuǎn)換為二進(jìn)制形式時(shí)候的表現(xiàn),其中第一位表示的是正負(fù),也就是符號(hào),剩下的63位表示的是字面數(shù)字。我們來簡(jiǎn)單看一下幾個(gè)關(guān)鍵的long數(shù)字轉(zhuǎn)換成二進(jìn)制的形式:
再來看一個(gè)二進(jìn)制數(shù)字轉(zhuǎn)換為long類型:
上面都是Java基礎(chǔ)知識(shí),相信大家都懂。
生成一個(gè)long類型的數(shù)字id,其實(shí)就是對(duì)這64位的二進(jìn)制形式里面填值,把這64位分成幾個(gè)部分,彼此間互不影響,每部分都有自己的生成規(guī)則,這樣在一定的簡(jiǎn)單的大前提下,能保證全局唯一。
先說第一位,long類型的數(shù)字是有符號(hào)的,第一位是0就是正數(shù),1是負(fù)數(shù),我們生成的id必然要正數(shù),所以第一位可以確定為0不變。
剩下的63位分成三大部分,第一部分占41位,用來表示時(shí)間,什么時(shí)間后面會(huì)詳細(xì)介紹。第二部分占10位,用來表示程序所在機(jī)器的信息,剩下的第三部分占12位,填充的是一個(gè)序列,可以理解為遞增數(shù)字,這樣前面的時(shí)間和機(jī)器數(shù)字如果都一樣的話,用序列的區(qū)別來生成不同的id。
上面的三大塊信息轉(zhuǎn)換成數(shù)字,填充到63位當(dāng)中,基本可以保證任何時(shí)間任何機(jī)器生產(chǎn)的任何id不重復(fù),可以推理出,時(shí)間和序列都是不可控的,但是機(jī)器信息是我們可以控制的,也就是說設(shè)置好機(jī)器信息是分布式id不重復(fù)的關(guān)鍵。
根據(jù)上面的理論可以開始學(xué)習(xí)雪花算法。
代碼地址:https://gitee.com/blueses/sno... 01
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/76100.html
摘要:前面的理論基礎(chǔ)和位運(yùn)算都了解了,下面我們來生成雪花算法的第一部分,也就是時(shí)間部分。這個(gè)時(shí)候就有一個(gè)問題了,如果我們系統(tǒng)的時(shí)鐘錯(cuò)了會(huì)不會(huì)有問題會(huì)所以要做判斷而且系統(tǒng)的時(shí)鐘錯(cuò)誤也是雪花算法的一個(gè)致命問題,所以要一定要保證服務(wù)器的系統(tǒng)時(shí)間正確。 前面的理論基礎(chǔ)和位運(yùn)算都了解了,下面我們來生成雪花算法的第一部分,也就是時(shí)間部分。時(shí)間部分的邏輯起始很簡(jiǎn)單,就是規(guī)定一個(gè)起始時(shí)間戳,然后用當(dāng)前時(shí)間戳...
摘要:前面介紹了雪花算法的理論基礎(chǔ),可以對(duì)大概的算法有個(gè)了解,但是細(xì)節(jié)上可能還是模糊,下面來說一下雪花算法中用到的位運(yùn)算。這就是雪花算法中兩個(gè)位移操作的作用。 前面介紹了雪花算法的理論基礎(chǔ),可以對(duì)大概的算法有個(gè)了解,但是細(xì)節(jié)上可能還是模糊,下面來說一下雪花算法中用到的位運(yùn)算。這里先介紹兩個(gè),一個(gè)是:
摘要:雪花算法初步完成后,我們討論了幾個(gè)位運(yùn)算的寫法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機(jī)器占多少位,或者時(shí)間向左位移多少,這些在算法具體邏輯確定后就不會(huì)變了。 雪花算法初步完成后,我們討論了幾個(gè)位運(yùn)算的寫法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機(jī)器占多少位,或者時(shí)間向左位移多少,這些在算法具體邏輯確定后就不會(huì)變了。那么寫成最后的數(shù)字和用位運(yùn)算計(jì)算出來有什么...
摘要:前面的內(nèi)容把雪花算法的時(shí)間部分和機(jī)器信息部分都生成了,下面來生成最后一部分,就是毫秒內(nèi)的序列。這樣毫秒內(nèi)的序列數(shù)就算獲取成功了。 前面的內(nèi)容把雪花算法的時(shí)間部分和機(jī)器信息部分都生成了,下面來生成最后一部分,就是毫秒內(nèi)的序列。什么意思呢?我們?cè)谏蓵r(shí)間部分獲取時(shí)間戳的時(shí)候,使用 long now = System.currentTimeMillis(); 獲取,是個(gè)毫秒級(jí)的時(shí)間戳,但是即...
摘要:并且通過函數(shù)營(yíng)造出雪花左右飄動(dòng)的效果,當(dāng)雪花落到窗口外面后將雪花重新移動(dòng)到窗口上方再次下落,實(shí)現(xiàn)如下速度和密度實(shí)際上不是平方的關(guān)系,這么些是為了效果更加錯(cuò)落有致完成,我們來看一下實(shí)際效果也可以去看看嗯,還挺像那么回事兒 首先新建一個(gè)html文件,將body的背景設(shè)置為天空的那種深藍(lán)色,并創(chuàng)建一個(gè)canvas,canvas的操作邏輯都放在snow.js中: body {...
閱讀 1944·2021-10-12 10:12
閱讀 3071·2019-08-30 15:44
閱讀 843·2019-08-30 15:43
閱讀 2993·2019-08-30 14:02
閱讀 2076·2019-08-30 12:54
閱讀 3496·2019-08-26 17:05
閱讀 1979·2019-08-26 13:34
閱讀 1050·2019-08-26 11:54