ID 生成器 雪花演算法

2021-08-21 02:29:13 字數 2127 閱讀 4010

我們的業務需求中通常有需要一些唯一的id,來記錄我們某個資料的標識:

看圖理解

詳細的看**注釋

public class snowflakeidworker 

if (datacenterid > maxdatacenterid || datacenterid < 0)

this.workerid = workerid;

this.datacenterid = datacenterid;

}// ******************************methods****************************************==

/*** 獲得下乙個id (該方法是執行緒安全的)

* @return snowflakeid

*/public synchronized long nextid()

// 如果是同一時間生成的,則進行毫秒內序列

// sequencemask 為啥是4095 2^12 = 4096

if (lasttimestamp == timestamp)

}// 時間戳改變,毫秒內序列重置

else

// 上次生成id的時間截

lasttimestamp = timestamp;

// 移位並通過或運算拼到一起組成64位的id

// 為啥時間戳減法向左移動22 位 因為 5位datacenterid

// 為啥 datcenterid向左移動17位 因為 前面有5位workid 還有12位序列號 就是17位

//為啥 workerid向左移動12位 因為 前面有12位序列號 就是12位

system.out.println(((timestamp - twepoch) << timestampleftshift) //

| (datacenterid << datacenteridshift) //

| (workerid << workeridshift) //

| sequence);

return ((timestamp - twepoch) << timestampleftshift) //

| (datacenterid << datacenteridshift) //

| (workerid << workeridshift) //

| sequence;

}/**

* 阻塞到下乙個毫秒,直到獲得新的時間戳

* @param lasttimestamp 上次生成id的時間截

* @return 當前時間戳

*/protected long tilnextmillis(long lasttimestamp)

return timestamp;

}/**

* 返回以毫秒為單位的當前時間

* @return 當前時間(毫秒)

*/protected long timegen()

// ******************************test*********************************************

/** 測試 */

public static void main(string args)

system.out.println((system.nanotime() - starttime) / 1000000 + "ms");}}

因為機器的原因會發生時間回撥,我們的雪花演算法是強依賴我們的時間的,如果時間發生回撥,有可能會生成重複的id

普通的演算法會直接丟擲異常,這裡我們可以對其進行優化,一般分為兩個情況:

直接拒絕,丟擲異常,打日誌,通知rd時鐘回滾。

利用擴充套件位,上面我們討論過不同業務場景位數可能用不到那麼多,那麼我們可以把擴充套件位數利用起來了,比如當這個時間回撥比較長的時候,我們可以不需要等待,直接在擴充套件位加1。2位的擴充套件位允許我們有3次大的時鐘回撥,一般來說就夠了,如果其超過三次我們還是選擇丟擲異常,打日誌。

分布式ID生成器(雪花演算法)

目前微服務架構盛行,在分布式系統中的操作中都會有一些全域性性id的需求,所以我們不能使用資料庫本身的自增功能來產生主鍵值,只能由程式來生成唯一的主鍵值。我們採用的是開源的twitter 非官方中文慣稱 推特.是國外的乙個 是乙個社交網路及微部落格服務 的snowflake 雪花 演算法。各個段解析 ...

分布式id生成器,雪花演算法IdWorker

名稱 idworker.j a 描述 分布式自增長id twitter的 snowflake j a實現方案 核心 為其idworker這個類實現,其原理結構如下,我分別用乙個0表示一位,用 分割開部分的作用 1 0 0000000000 0000000000 0000000000 00000000...

id生成器演算法設計

摘要 原理說明 1.每個資料庫儲存初始值 2.業務獲取值後修改資料庫的初始值 現初始值 源初始值 資料庫個數 步長 原子操作 3.業務拿到初始值後,獲取的資料集合是 開始值 開始值 步長 設定步長 in 原理說明 1.每個資料庫儲存初始值 2.業務獲取值後修改資料庫的初始值 現初始值 源初始值 資料...