1. 程式人生 > >Twitter的分散式自增ID演算法snowflake (Java版)

Twitter的分散式自增ID演算法snowflake (Java版)

概述

分散式系統中,有一些需要使用全域性唯一ID的場景,這種時候為了防止ID衝突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。

有些時候我們希望能使用一種簡單一些的ID,並且希望ID能夠按照時間有序生成。

而twitter的snowflake解決了這種需求,最初Twitter把儲存系統從MySQL遷移到Cassandra,因為Cassandra沒有順序ID生成機制,所以開發了這樣一套全域性唯一ID生成服務。

結構

snowflake的結構如下(每部分用-分開):

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

第一位為未使用,接下來的41位為毫秒級時間(41位的長度可以使用69年),然後是5位datacenterId和5位workerId(10位的長度最多支援部署1024個節點) ,最後12位是毫秒內的計數(12位的計數順序號支援每個節點每毫秒產生4096個ID序號)

一共加起來剛好64位,為一個Long型。(轉換成字串長度為18)

snowflake生成的ID整體上按照時間自增排序,並且整個分散式系統內不會產生ID碰撞(由datacenter和workerId作區分),並且效率較高。據說:snowflake每秒能夠產生26萬個ID。

原始碼

(JAVA版本的原始碼)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 /** Snowflake */ public class IdWorker { private final long twepoch = 1288834974657L; private final long workerIdBits = 5L; private final long datacenterIdBits = 5L; private final long maxWorkerId = -1L ^ (-1L << workerIdBits);

相關推薦

Twitter分散式ID演算法snowflake (Java)

概述 分散式系統中,有一些需要使用全域性唯一ID的場景,這種時候為了防止ID衝突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。 有些時候我們希望能使用一種簡單一些的ID,並且希望ID能夠按照時間有序生成。

Twitter分散式ID演算法snowflake(有改動Java

分散式ID生成器 全域性唯一ID生成 分散式純數字ID 其實這也不是Twitter獨有的,mongodb也採用類似的方法生產自增ID。對於全域性唯一ID的說明請參考我另一篇文章 : 高併發分

Twitter分散式ID演算法snowflake

概述分散式系統中,有一些需要使用全域性唯一ID的場景,這種時候為了防止ID衝突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。有些時候我們希望能使用一種簡單一些的ID,並且希望ID能夠按照時間有序生成。而twitter的snowf

詳解Twitter開源分散式ID演算法snowflake,附演算驗證過程

@ToString @Slf4j public class SnowflakeIdFactory { private final long twepoch = 1288834974657L; private final long workerIdBits = 5L; private

基於.NET Standard的分散式ID演算法--Snowflake

概述 本篇文章主要講述分散式ID生成演算法中最出名的Snowflake演算法。搞.NET開發的,資料庫主鍵最常見的就是int型別的自增主鍵和GUID型別的uniqueidentifier。 那麼為何還要引入snowflake呢? INT自增主鍵 自增主鍵是解決主鍵生成的最簡單方案,它有如下優勢:

分散式ID演算法——雪花演算法 (snowflakeJava)。

概述         分散式系統中,有一些需要使用全域性唯一ID的場景,這種時候為了防止ID衝突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。 有些時候我們希望能使用一種簡單一些的ID,並且希望ID能夠按照時間有序生成。   

基於.NET Standard的分散式ID演算法--Leaf-segment

概述 前一篇文章講述了最流行的分散式ID生成演算法snowflake,本篇文章根據美團點評分散式ID生成系統文章,介紹另一種相對更容易理解和編寫的分散式ID生成方式。 實現原理 Leaf這個名字是來自德國哲學家、數學家萊布尼茨的一句話: There are no two identical

Twitter分散式ID雪花演算法snowflake (Java)

概述 分散式系統中,有一些需要使用全域性唯一ID的場景,這種時候為了防止ID衝突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。 有些時候我們希望能使用一種簡單一些的ID,並且希望ID能夠按照時間有序生成。 而twitter的s

Twitter-Snowflake,64位ID演算法詳解

     這樣的好處是,整體上按照時間自增排序,並且整個分散式系統內不會產生ID碰撞(由datacenter和機器ID作區分),並且效率較高,經測試,snowflake每秒能夠產生26萬ID左右,完全滿足需要。 Snowflake演算法核心 把時間戳,工作機器id,序列號組合在一起。 除了最

Twitter-SnowflakeID演算法

簡介 Twitter 早期用 MySQL 儲存資料,隨著使用者的增長,單一的 MySQL 例項沒法承受海量的資料,後來團隊就研究如何產生完美的自增ID,以滿足兩個基本的要求: 每秒能生成幾十萬條 ID 用於標識不同的 記錄; 這些 ID 應該可以有個大致的順序,也就是說釋出時間相近的兩條記錄,它們的 ID也

雪花演算法:構建分散式id

目錄 一、訂單id的特殊性 二、雪花演算法 三、簡單原理 四、演算法實現 五、配置 六、載入屬性 七、編寫配置類 八、使用 九、程式碼詳解 一、訂單id的特殊性 訂單資料非常龐大,將來一定會做分庫分表。那麼這種情況下, 要保證id的唯一,就不能靠資料庫

SnowflakeId雪花ID演算法分散式ID應用

概述 snowflake是Twitter開源的分散式ID生成演算法,結果是一個Long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是資料中心,5個bit的機器ID),12bit作為毫秒內的序列號(意味著每個節點在每毫秒可以產生 4096 個 ID),最後還有一個

Redis生成分散式ID

使用redis的RedisAtomicLong可以生成分散式自增的ID值。 SequenceFactory是封裝的一個工具類,利用redisTemplate生成自增ID,實現如下: import org.springframework.beans.facto

.NET 分散式Id元件(解決自動分配機器Id、時間回撥問題)

目錄 簡介 產生背景 使用方式 原始版 完美版 測試 結尾 簡介 IdHelper是一個.NET(支援.NET45+或.NET Standard2+)生成分散式趨勢自增Id元件,有兩個版本:原始版為基於雪花Id(不瞭解請自行百度)方案,需要手動管理設定WorkerId;完美版在原始版的基礎上使用Zoo

Twitter的分布式ID算法snowflake (Java)

開發 使用 ++ fin form 數據中心 mes protected mov 概述 分布式系統中,有一些需要使用全局唯一ID的場景,這種時候為了防止ID沖突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。 有些時候我們希

Twitter的雪花演算法snowflakeID

前言   這個問題源自於,我想找一個分散式下的ID生成器。   這個最簡單的方案是,資料庫自增ID。為啥不用咧?有這麼幾點原因,一是,會依賴於資料庫的具體實現,比如,mysql有自增,oracle沒有,得用序列,mongo似乎也沒有他自己有個什麼ID,sql

【Zanuck 鎮】編寫php高效能snowflake演算法外掛(分散式64位唯一性id生成演算法)

好了,現在開始,先用C語言實現snowflake演算法,用C語言實現非常簡單,只要按照snowflake演算法的規則來就行了,我摘抄了csdn上一個比較好的演算法,地址如下:http://blog.csdn.net/wallwind/article/details/49701397,但是博主沒有做註釋,但是我

C語言實現分散式有序的唯一ID生成演算法-snowflake演算法

轉自:http://blog.csdn.net/wallwind/article/details/49701397 之前有人問我設計一個分散式的遞增的唯一id生成。想了半天不知道,偶然一個同事說起snowflake演算法,我百度了一下,很簡單高效。 參考 https

分散式演算法snowflake,但是效率 ?

生成的id結構 SnowFlake所生成的ID一共分成四部分: 1.第一位 佔用1bit,其值始終是0,沒有實際作用。 2.時間戳 佔用41bit,精確到毫秒,總共可以容納約69 年的時間。 3.工作機器id 佔用10bit,其中高位5bit是

ID算法snowflake(雪花)

ges gui python 訂單 解決 mage ans log pytho 在數據庫主鍵設計上,比較常見的方法是采用自增ID(1開始,每次加1)和生成GUID。生成GUID的方式雖然簡單,但是由於采用的是無意義的字符串,推測會在數據量增大時造成訪問過慢,在基礎互