🙂🙂🙂關注微信公衆號:【芋艿的後端小屋】有福利: html
- RocketMQ / MyCAT / Sharding-JDBC 全部源碼分析文章列表
- RocketMQ / MyCAT / Sharding-JDBC 中文註釋源碼 GitHub 地址
- 您對於源碼的疑問每條留言都將獲得認真回覆。甚至不知道如何讀源碼也能夠請教噢。
- 新的源碼解析文章實時收到通知。每週更新一篇左右。
在平常開發中,數據庫的id是不可少的。在各個場景下會有不一樣的選擇,本文對互聯網上常見的ID算法進行概括,但願對工程師們有一點點幫助。redis
1. 數據庫自增
- MySQL、Oracle、PGSQL等關係數據庫的id主鍵自增
- Redis、Memcached等K/V數據庫的incr操做自增
- MongoDB本身維護一個id自增集合
- MongoDB的Update操做支持incr操做,所以能夠這麼作。
- 該方式適用於支持該操做的其餘數據庫。
2. 類UUID算法
- UUID
- MongoDB的ObjectId
3. SnowFlake
Twitter-Snowflake算法產生的背景至關簡單,爲了知足Twitter每秒上萬條消息的請求,每條消息都必須分配一條惟一的id,這些id還須要一些大體的順序(方便客戶端排序),而且在分佈式系統中不一樣機器產生的id必須不一樣。算法
64bits從左往右依次是chrome
- 1bit 保留
- 41bits 時間戳
- 支持69.7年須要的id。2 ^41 /365/24/60/60/1000=69.7
- 10bits work-id
- 12bits sequence-id
- 支持每work每毫秒4096個id
- 支持每work每秒4096000個id
- 若當前毫秒超過4096,則sleep1毫秒,獲取下一毫秒的自增
snowflake的意義,不單單在於提供瞭解決方式,更多的是一種基於Long長度實現具備時間相關性的id自增序列。所以,不少公司基於它進行二次改造適應本身的場景 數據庫
3.2 Instagram SnowFlake
去中性化,基於PGSQL實現後端
64bits從左至右依次是微信
- 41bits 時間戳
- 13bits logic-shard-id
- 10bits sequence-id
實現方式框架
- 根據
share-key
獲取對應的PGSQL實例-庫
- id使用PGSQL的存儲過程
- 13bits =
share-key對應值%logic-share-id
- 10bits =
該Table的auto_increment_id%(2 ^10)
好處分佈式
3.3 Simpleflake
64bits源碼分析
- 去中性化
- 將work-id的12bits給sequence-id。徹底隨機,每毫秒有1/(2^22 )出現衝突的狀況。數據量大時須要注意。
- 將來能夠平滑遷移到Twitter SnowFlake
3.4 Boundary flake
去中性化,基於erlang實現
128bits從左到右依次是
- 64bits 時間戳
- 48bits work-id
- 14bits sequence-id
3.5 本身的想法
參考Instagram SnowFlake的作法
去中心化,基於redis實現
64bits從左到右依次是
- 1bit 保留
- 41bits 時間戳
- 12bits 基於logic-shard-id
- 10bits 基於時間戳+logic-shard-id在redis裏自增
4. 參考文章
- 互聯網分佈式id生成方法|msup微課乾貨
- 服務化框架-分佈式Unique ID的生成方法一覽
- 分佈式系統中 Unique ID 的生成方法