雪花算法 - snowflake

概述

分佈式系統中,有一些須要使用全局惟一ID的場景,這種時候爲了防止ID衝突可使用36位的UUID,可是UUID有一些缺點,首先他相對比較長,另外UUID通常是無序的。分佈式

有些時候咱們但願能使用一種簡單一些的ID,而且但願ID可以按照時間有序生成。測試

而twitter的snowflake解決了這種需求,最初Twitter把存儲系統從MySQL遷移到Cassandra,由於Cassandra沒有順序ID生成機制,因此開發了這樣一套全局惟一ID生成服務。spa

結構

snowflake的結構以下(每部分用-分開):
clipboard.pngblog

  • 最高位是符號位,始終爲0,不可用
  • 接下來的41位爲毫秒級時間(41位的長度可使用69年)
  • 而後是5位datacenterId和5位workerId(10位的長度最多支持部署1024個節點)
  • 最後12位是毫秒內的計數(12位的計數順序號支持每一個節點每毫秒產生4096個ID序號)

一共加起來恰好64位,爲一個Long型。(轉換成字符串後長度最多19)排序

snowflake生成的ID總體上按照時間自增排序,而且整個分佈式系統內不會產生ID碰撞(由datacenter和workerId做區分),而且效率較高。經測試snowflake每秒可以產生26萬個ID。ip

相關文章
相關標籤/搜索