您好,登錄后才能下訂單哦!
針對每個公司,隨著服務化演進,單個服務越來越多,數據庫分的越來越細,有的時候一個業務需要分成好幾個庫,這時候自增主鍵或者序列之類的主鍵id生成方式已經不再滿足需求,分布式系統中需要的是一個全局唯一的id生成規則。既然號稱在全局分布式系統中唯一,那么主鍵的生成規則必然要復雜一些,以前看過很多資料,都對雪花的生成一知半解,最后才發現是對Java的位運算沒有徹底了解,這里想針對雪花算法,以一種淺顯的的方式來進行學習,去除以前的一知半解和對雪花算法的神秘感。
雪花算法生成的最終結果其實就是一個long類型的Java長整型數字,這是一個大前提!算法所有的內容都是針對這個數字進行運算的。Java基礎類型相信都很熟悉,有32位的整型int類型,和64位的長整型long類型。我們單說long類型,64位說的是數字轉換為二進制形式時候的表現,其中第一位表示的是正負,也就是符號,剩下的63位表示的是字面數字。我們來簡單看一下幾個關鍵的long數字轉換成二進制的形式:
再來看一個二進制數字轉換為long類型:
上面都是Java基礎知識,相信大家都懂。
生成一個long類型的數字id,其實就是對這64位的二進制形式里面填值,把這64位分成幾個部分,彼此間互不影響,每部分都有自己的生成規則,這樣在一定的簡單的大前提下,能保證全局唯一。
先說第一位,long類型的數字是有符號的,第一位是0就是正數,1是負數,我們生成的id必然要正數,所以第一位可以確定為0不變。
剩下的63位分成三大部分,第一部分占41位,用來表示時間,什么時間后面會詳細介紹。第二部分占10位,用來表示程序所在機器的信息,剩下的第三部分占12位,填充的是一個序列,可以理解為遞增數字,這樣前面的時間和機器數字如果都一樣的話,用序列的區別來生成不同的id。
上面的三大塊信息轉換成數字,填充到63位當中,基本可以保證任何時間任何機器生產的任何id不重復,可以推理出,時間和序列都是不可控的,但是機器信息是我們可以控制的,也就是說設置好機器信息是分布式id不重復的關鍵。
根據上面的理論可以開始學習雪花算法。
代碼地址:https://gitee.com/blueses/snowflake-demo 01
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。