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應用以減輕資料庫負...