摘要:雪花算法初步完成后,我們討論了幾個位運算的寫法,大家知道雪花算法一旦確定后,很多數字都是定死的,比如機器占多少位,或者時間向左位移多少,這些在算法具體邏輯確定后就不會變了。
雪花算法初步完成后,我們討論了幾個位運算的寫法,大家知道雪花算法一旦確定后,很多數字都是定死的,比如機器占多少位,或者時間向左位移多少,這些在算法具體邏輯確定后就不會變了。那么寫成最后的數字和用位運算計算出來有什么區(qū)別呢?
其實沒有區(qū)別,我們的程序分為編譯期和運行期,我們直接把程序編譯好,然后查看class文件,就會發(fā)現(xiàn),兩種寫法編譯結果是一樣的。用位運算計算出來只是更加靈活而已,定義很多死的數字也容易寫錯,后期維護混亂。所以,下面我們來一個最終版,首先看基本的幾個常量定義:
然后看時間部分的常量:
再看機器信息的常量:
最后看毫秒內序列的常量定義:
上面的常量中,只要修改最開始的四個部分的長度,下面的所有常量都會自動修改。
再來看一下主程序:
注意上面判斷統(tǒng)一毫秒內序列的變化。其它輔助方法都沒有什么變化,不再討論?,F(xiàn)在我們再看看編譯完后生成的class文件:
可以看到編譯后的文件其實就是最終定義了死的常數。包括主程序也是一樣:
上面就是雪花算法的最終版?。?!
最后來測試一下效率,我們來生成300萬個id看看花費的時間:
代碼地址:https://gitee.com/blueses/sno... 07
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/76166.html
摘要:原理的雪花算法,使用語言實現(xiàn)。生成的整體上按照時間自增排序,并且整個分布式系統(tǒng)內不會產生碰撞由和作區(qū)分,并且效率較高。據說每秒能夠產生萬個。 分布式系統(tǒng)中,有一些需要使用全局唯一ID的場景,這種時候為了防止ID沖突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。 有些時候我們希望能使用一種簡單一些的ID,并且希望ID能夠按照時間有序生成。 ...
摘要:前面的理論基礎和位運算都了解了,下面我們來生成雪花算法的第一部分,也就是時間部分。這個時候就有一個問題了,如果我們系統(tǒng)的時鐘錯了會不會有問題會所以要做判斷而且系統(tǒng)的時鐘錯誤也是雪花算法的一個致命問題,所以要一定要保證服務器的系統(tǒng)時間正確。 前面的理論基礎和位運算都了解了,下面我們來生成雪花算法的第一部分,也就是時間部分。時間部分的邏輯起始很簡單,就是規(guī)定一個起始時間戳,然后用當前時間戳...
摘要:雪花算法生成的最終結果其實就是一個類型的長整型數字,這是一個大前提算法所有的內容都是針對這個數字進行運算的。根據上面的理論可以開始學習雪花算法。 針對每個公司,隨著服務化演進,單個服務越來越多,數據庫分的越來越細,有的時候一個業(yè)務需要分成好幾個庫,這時候自增主鍵或者序列之類的主鍵id生成方式已經不再滿足需求,分布式系統(tǒng)中需要的是一個全局唯一的id生成規(guī)則。既然號稱在全局分布式系統(tǒng)中唯一...
摘要:前面的內容把雪花算法的時間部分和機器信息部分都生成了,下面來生成最后一部分,就是毫秒內的序列。這樣毫秒內的序列數就算獲取成功了。 前面的內容把雪花算法的時間部分和機器信息部分都生成了,下面來生成最后一部分,就是毫秒內的序列。什么意思呢?我們在生成時間部分獲取時間戳的時候,使用 long now = System.currentTimeMillis(); 獲取,是個毫秒級的時間戳,但是即...
摘要:前面介紹了雪花算法的理論基礎,可以對大概的算法有個了解,但是細節(jié)上可能還是模糊,下面來說一下雪花算法中用到的位運算。這就是雪花算法中兩個位移操作的作用。 前面介紹了雪花算法的理論基礎,可以對大概的算法有個了解,但是細節(jié)上可能還是模糊,下面來說一下雪花算法中用到的位運算。這里先介紹兩個,一個是:
閱讀 2985·2023-04-26 02:04
閱讀 1293·2021-11-04 16:07
閱讀 3723·2021-09-22 15:09
閱讀 689·2019-08-30 15:54
閱讀 1912·2019-08-29 14:11
閱讀 2539·2019-08-26 12:19
閱讀 2265·2019-08-26 12:00
閱讀 771·2019-08-26 10:27