twitter的snowflake演算法

2021-08-07 05:11:52 字數 1431 閱讀 9559

snowflake演算法是twitter提出的乙個用來生成不重複id的演算法,用於解決id衝突。適用於:先插資料,然後根據id更新資料。還有分布式多機同時取id。

這個演算法本身並不複雜,它的原理是根據時間(ms)來不斷更新id。id由64bit組成,分為workerid、datacenterid、timestamp(ms)、sequence四部分。其中workerid佔5個bit,datacenterid佔5個bit,sequence佔12個bit。為了不產生溢位,timestamp還要減去乙個固定值。因為timestamp本身就是32位的數值,新增了毫秒以後位數就多了。減去乙個固定值以後,可以有效的減少位數,而不產生衝突,保證重複性。

private[this] val workeridbits = 5l

private[this] val datacenteridbits = 5l

private[this] val maxworkerid = -1l ^ (-1l << workeridbits)

private[this] val maxdatacenterid = -1l ^ (-1l << datacenteridbits)

private[this] val sequencebits = 12l

private[this] val workeridshift = sequencebits

private[this] val datacenteridshift = sequencebits + workeridbits

private[this] val timestampleftshift = sequencebits + workeridbits + datacenteridbits

private[this] val sequencemask = -1l ^ (-1l << sequencebits)

timestamp放在最左邊,然後是datacenterid,接著是workerid,最後是sequence。sequence最大可以達到12位,也就是說每個毫秒對datacenterid+workerid可以產生4095個id。我相信對每秒上萬的qps的伺服器也是足夠用的了。下面的**是生成演算法,從twitter的原始碼拷出來的。

((timestamp - twepoch) << timestampleftshift) |

(datacenterid << datacenteridshift) |

(workerid << workeridshift) |

sequence

這個演算法我們已經用於統計http請求,有一些業務需要記錄請求的引數,以便查詢和定位問題,這個記錄要分為兩步,每一步是請求進來的引數,如果請求處理完了,在返回前,還要把這個請求的結果再更新一把。

從目前的情況來看,執行效果良好。唯一要注意的是,這個演算法必須是乙個單例,否則每次sequence都從0開始會產生衝突。

Twitter模式的效應

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

Twitter的snowflake演算法改進

twitter的snowflake演算法是在分布式系統中一種自增id的演算法,id能夠按照時間有序生成並且可以做到全域性唯一。演算法生成的是long型別的id,乙個long型別佔8個位元組,每個位元組佔8位元,也就是說乙個long型別佔64個位元 0和1 twitter是這樣分配的 正數字 佔1位元...

Twitter學習 MemCached基礎篇

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