分布式資料庫主鍵 雪花演算法

2021-09-25 03:38:38 字數 3035 閱讀 9137

snowflake 演算法

snowflake

演算法是twitter

開源的分布式

id 生成演算法,就是把

乙個64

位的long

型的id,1

個bit

是不用的,用其中的

41 bit

作為毫秒數,用

10 bit

作為工作機器id,

12 bit

作為序列號。

0 | 0001100 10100010 10111110 10001001 01011100 00 | 10001 | 1 1001 | 0000 00000000

public class idworker 

if (datacenterid > maxdatacenterid || datacenterid < 0)

system.out.printf(

"worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d",

timestampleftshift, datacenteridbits, workeridbits, sequencebits, workerid);

this.workerid = workerid;

this.datacenterid = datacenterid;

this.sequence = sequence;

}private long twepoch = 1288834974657l;

private long workeridbits = 5l;

private long datacenteridbits = 5l;

// 這個是二進位制運算,就是 5 bit最多只能有31個數字,也就是說機器id最多只能是32以內

private long maxworkerid = -1l ^ (-1l << workeridbits);

// 這個是乙個意思,就是 5 bit最多只能有31個數字,機房id最多只能是32以內

private long maxdatacenterid = -1l ^ (-1l << datacenteridbits);

private long sequencebits = 12l;

private long workeridshift = sequencebits;

private long datacenteridshift = sequencebits + workeridbits;

private long timestampleftshift = sequencebits + workeridbits + datacenteridbits;

private long sequencemask = -1l ^ (-1l << sequencebits);

private long lasttimestamp = -1l;

public long getworkerid()

public long getdatacenterid()

public long gettimestamp()

public synchronized long nextid()

if (lasttimestamp == timestamp)

} else

// 這兒記錄一下最近一次生成id的時間戳,單位是毫秒

lasttimestamp = timestamp;

// 這兒就是將時間戳左移,放到 41 bit那兒;

// 將機房 id左移放到 5 bit那兒;

// 將機器id左移放到5 bit那兒;將序號放最後12 bit;

// 最後拼接起來成乙個 64 bit的二進位制數字,轉換成 10 進製就是個 long 型

return ((timestamp - twepoch) << timestampleftshift) | (datacenterid << datacenteridshift)

| (workerid << workeridshift) | sequence;

}private long tilnextmillis(long lasttimestamp)

return timestamp;

}private long timegen()

// ---------------測試---------------

public static void main(string args)

}}

怎麼說呢,大概這個意思吧,就是說

41 bit

是當前毫秒單位的乙個時間戳,就這意思;然後

5 bit

是你傳遞進來的乙個機房

id(但是最大只能是

32 以內),另外

5 bit

是你傳遞進來的機器

id(但是最大只能是

32 以內),剩下的那個

12 bit

序列號,就是如果跟你上次生成

id 的時間還在乙個毫秒內,那麼會把順序給你累加,最多在

4096

個序號以內。

所以你自己

利用這個工具類

,自己搞乙個服務,然後對每個機房的每個機器都初始化這麼乙個東西,剛開始這個機房的這個機器的序號就是

0。然後每次接收到乙個請求,說這個機房的這個機器要生成乙個

id,你就找到對應的

worker

生成。

利用這個

snowflake

演算法,你可以開發自己公司的服務,甚至對於機房

id 和機器

id,反正給你預留了

5 bit + 5 bit

,你換成別的有業務含義的東西也可以的。 這個

snowflake

演算法相對來說還是比較靠譜的,所以

你要真是搞分布式

id 生成,如果是高併發啥的,那麼用這個應該效能比較好,一般每秒幾萬併發的場景,也足夠你用了。

分布式資料庫

網路選課系統中分布式資料庫設計 何翠雙王巧雲張麗麗 摘要 關鍵字 選課 分布式 資料庫 distributed system of on line course choosing abstract key words course choosing distributed database 隨著學校...

分布式資料庫

1 背景 我們知道資料是乙個公司的命脈,隨著業務越做越大,資料量也會越來越大,計算也會越來越複雜,效能,可靠性,可擴充套件性的需求就會越來越強烈,這個時候乙個集中式的資料庫顯然已經滿足不了需求了。對於技術決策者來說有兩條路可以走,第一 按照現有的大型資料庫的解決方案,比如sql server clu...

分布式資料庫

一 分布式資料庫的出現的場景 網際網路 軟體國產化 o2o 五新 新零售 新製造,新金融 新資源 新技術 等主題接連提出來,並且在各個行業落地,給資料庫帶來了巨大機會,具體包含3個方向 1.遠超單機資料庫容量的資料儲存和訪問峰值 2.實時資料分析檢索 oltp兼顧olap 3.更高階別的容災需求。這...