Twitter的snowflake演算法改進

2021-10-01 10:49:16 字數 1991 閱讀 2892

twitter的snowflake演算法是在分布式系統中一種自增id的演算法,id能夠按照時間有序生成並且可以做到全域性唯一。

演算法生成的是long型別的id,乙個long型別佔8個位元組,每個位元組佔8位元,也就是說乙個long型別佔64個位元(0和1)。

twitter是這樣分配的:正數字(佔1位元)+時間戳(佔41位元)+機器id(佔5位元)+資料中心(佔5位元)+自增值(佔12位元),總共64位元組成的乙個long型別。

snowflake的優點是,整體上按照時間自增排序,並且整個分布式系統內不會產生id碰撞(由資料中心id和機器id作區分),並且效率較高,經測試,snowflake每秒能夠產生26萬id左右。

snowflake演算法有乙個弊端,每毫秒重新計數,空閒時間會浪費很多id空間。針對空閒時間會浪費很多id空間的改進辦法:咱們可以把時間戳的單位改為秒。使用31個位元的時間戳(秒),節約了10個位元,2的31次方等於2,147,483,648秒,約為69年。然後我們把節約出來的10個位元交給自增值,此時自增值(12+10=22位元),即2的22次方等於4,194,304。

改進前的snowflake演算法結構為:正數字(佔1位元)+時間戳(佔41位元)+機器id(佔5位元)+資料中心id(佔5位元)+自增值(佔12位元)

改進後的snowflake演算法結構為:正數字(佔1位元)+時間戳(佔31位元)+機器id(佔5位元)+資料中心id(佔5位元)+自增值(佔22位元)

改進後的優點:避免空閒時間會浪費很多id空間,支援每秒生成419萬個id。

改進後的實現**如下:

public class snowflakeidworker2nd 

if (datacenterid > maxdatacenterid || datacenterid < 0)

this.workerid = workerid;

this.datacenterid = datacenterid;

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

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

* * @return snowflakeid

*/public synchronized long nextid()

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

if (lasttimestamp == timestamp)

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

else

// 上次生成id的時間截

lasttimestamp = timestamp;

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

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

| (datacenterid << datacenteridshift) //

| (workerid << workeridshift) //

| sequence;

} /**

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

* * @param lasttimestamp

* 上次生成id的時間截

* @return 當前時間戳

*/protected int tilnextmillis(int lasttimestamp)

return timestamp;

} /**

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

* * @return 當前時間(秒)

*/protected int timegen()

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

/** 測試 */

public static void main(string args)

}}

twitter的snowflake演算法

snowflake演算法是twitter提出的乙個用來生成不重複id的演算法,用於解決id衝突。適用於 先插資料,然後根據id更新資料。還有分布式多機同時取id。這個演算法本身並不複雜,它的原理是根據時間 ms 來不斷更新id。id由64bit組成,分為workerid datacenterid t...

Twitter模式的效應

昨晚乙個老同學,給我 說想複製twitter模式。在國內,已經有幾家這樣的 了,比如飯否,滔滔,嘰歪等。之前自己還註冊了乙個網域名稱,類似於twitter,早想做了,但是放棄了,個人覺得國內的模式不成熟,環境不夠。不過國內的3g已經開始,隨著國內的通訊發展,以後可能環境會好起來。其實現在自己所在公司...

Twitter學習 MemCached基礎篇

twitter大量使用memcached,mq也是基於memcached 協議的,memcached並不是新鮮的東西,但是由於它強大的影響力,有必要深入一下,這篇主要講它的基礎 1.memcached是什麼?memcached 是乙個高效能的分布式記憶體物件快取系統,用於動態web應用以減輕資料庫負...