一天 時間戳毫秒 雪花演算法(05)毫秒內序列

2021-10-18 08:00:19 字數 1019 閱讀 7348

前面的內容把雪花演算法的時間部分和機器資訊部分都生成了,下面來生成最後一部分,就是毫秒內的序列。什麼意思呢?我們在生成時間部分獲取時間戳的時候,使用 long now = system.currenttimemillis(); 獲取,是個毫秒級的時間戳,但是即使是這麼短的時間,對於電腦來說也足夠生成很多個id,所以很多id可能會在同乙個毫秒內生成,也就是時間部分的數值一樣。這個時候就要讓同乙個毫秒內生成的id加上數字序列標識,就是第三部分的序列。第三部分佔的長度是12位,轉成整數值就是4095,所以最後一部分的範圍就是4095到0之間的數字。如果毫秒內訪問的數量超過了這個限制怎麼辦?沒法解決,只能強制等到下一毫秒再生產id。這就是第三部分的作用。

下面先定義乙個序列初始值:

序列由於和時間戳有關係,所以要載入時間戳真正開始使用之前:

簡單粗暴,就是while迴圈等下一毫秒就可以。這樣毫秒內的序列數就算獲取成功了。

我們三大部分的數字都獲取成功了,最後直接位移加合併就行:

這樣雪花演算法就寫完了,下面執行一下測試:

是乙個18位的long型別數字,確實是我們要的結果。等等!是不是有問題?如果此時多個執行緒訪問,會產生重複的id!現在的程式確實有多併發問題,需要加上鎖:

這樣我們的雪花演算法算是初步完成了。基本也符合專案對唯一id的要求!現在的寫法和網上的例子還有些差別,下面我們講講差別相關的內容。

mysql當天時間和前一天時間

獲取當前的年月日,我使用的是 curdate 下一天或者前一天 curdate 1curdate 1 這是錯誤的寫法 mysql官網也是不承認時間直接相加減的,雖然會將當前時間轉換為20160802,這時候就是比較這一串字元,mysql官網是不承認用這種方式比較時間大小的正確的sql語句 selec...

PHP 前一天 後一天時間

date default timezone set prc 預設時區 echo 今天 date y m d time echo 今天 date y m d strtotime 18 june 2008 echo 昨天 date y m d strtotime 1 day echo 明天 date y...

php時間的操作,前一天,後一天時間的獲取

date default timezone set prc 預設時區 echo 今天 date y m d time echo 今天 date y m d strtotime 18 june 2008 echo 昨天 date y m d strtotime 1 day echo 明天 date y...