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

2022-09-10 07:03:08 字數 2082 閱讀 8902

/**

* 名稱:idworker.j**a

* 描述:分布式自增長id

** twitter的 snowflake j**a實現方案

*

* 核心**為其idworker這個類實現,其原理結構如下,我分別用乙個0表示一位,用—分割開部分的作用:

* 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000

* 在上面的字串中,第一位為未使用(實際上也可作為long的符號位),接下來的41位為毫秒級時間,

* 然後5位datacenter標識位,5位機器id(並不算識別符號,實際是為執行緒標識),

* 然後12位該毫秒內的當前毫秒內的計數,加起來剛好64位,為乙個long型。

* 這樣的好處是,整體上按照時間自增排序,並且整個分布式系統內不會產生id碰撞(由datacenter和機器id作區分),

* 並且效率較高,經測試,snowflake每秒能夠產生26萬id左右,完全滿足需要。

* * 64位id (42(毫秒)+5(機器id)+5(業務編碼)+12(重複累加))

* *

@author

polim */

@configuration

public

class

idworker

/***

@param

workerid

* 工作機器id

* @param

datacenterid

* 序列號

*/public idworker(long workerid, long

datacenterid)

if (datacenterid > maxdatacenterid || datacenterid < 0)

this.workerid =workerid;

this.datacenterid =datacenterid;

}/*** 獲取下乙個id**

@return

*/public

synchronized

long

nextid()

if (lasttimestamp ==timestamp)

} else

lasttimestamp =timestamp;

//id偏移組合生成最終的id,並返回id

long nextid = ((timestamp - twepoch) <| (datacenterid <| (workerid << workeridshift) |sequence;

return

nextid;

}private

long tilnextmillis(final

long

lasttimestamp)

return

timestamp;

}private

long

timegen()

/*** * 獲取 maxworkerid

* */protected

static

long getmaxworkerid(long datacenterid, long

maxworkerid)

/** mac + pid 的 hashcode 獲取16個低位

*/return (mpid.tostring().hashcode() & 0xffff) % (maxworkerid + 1);

}/*** * 資料標識id部分

* */protected

static

long getdatacenterid(long

maxdatacenterid)

else

} catch

(exception e)

return

id; }

}使用時,用自動注入即可

@autowired

private idworker idworker;

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

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

分布式ID生成器

一 需求緣起 幾乎所有的業務系統,都有生成乙個唯一記錄標識的需求,例如 這個記錄標識往往就是資料庫中的主鍵,資料庫上會建立聚集索引 cluster index 即在物理儲存上以這個字段排序。這個記錄標識上的查詢,往往又有分頁或者排序的業務需求,例如 所以往往要有乙個time欄位,並且在time欄位上...

分布式 ID 生成器

乙個唯一 id 在乙個分布式系統中是非常重要的乙個業務屬性,其中包括一些如訂單 id,訊息 id 會話 id,他們都有一些共有的特性 全域性唯一很好理解,目的就是唯一標識某個次請求,某個業務。通常有以下幾種方案 可以利用mysql中的自增屬性auto increment來生成全域性唯一 id,也能保...