.Net Core 雪花算法(SnowFlake)


概述

分布式系統中,有一些需要使用全局唯一ID的場景,這種時候為了防止ID沖突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。有些時候我們希望能使用一種簡單一些的ID,並且希望ID能夠按照時間有序生成。而twitter的snowflake解決了這種需求,最初Twitter把存儲系統從MySQL遷移到Cassandra,因為Cassandra沒有順序ID生成機制,所以開發了這樣一套全局唯一ID生成服務。

雪花算法的原始版本是 Scala 版,用於生成分布式ID(純數字,時間順序),訂單編號等。

自增ID:對於數據敏感場景不宜使用,且不適合於分布式場景。
GUID:采用無意義字符串,數據量增大時造成訪問過慢,且不宜排序。

算法描述

  • 最高位是符號位,始終為0,不可用。
  • 41位的時間序列,精確到毫秒級,41位的長度可以使用69年。時間位還有一個很重要的作用是可以根據時間進行排序。
  • 10位的機器標識,10位的長度最多支持部署1024個節點。
  • 12位的計數序列號,序列號即一系列的自增id,可以支持同一節點同一毫秒生成多個ID序號,12位的計數序列號支持每個節點每毫秒產生4096個ID序號。

.Net Core 的雪花算法

源碼地址: https://github.com/stulzq/snowflake-net

我一般直接在 .net core 項目中使用 Nuget 獲得該組件,進行直接使用,如下圖:

Nuget 包管理器中搜索 snowflake 即可

var worker = new IdWorker(1, 1);
long id = worker.NextId();

以上代碼, IdWorker 應該以單實例模式運行,否則會出現重復Id。

理論上兩個參數:
在同一workid,datacenterid下,1ms 能產生2^12 – 1(4095)個id。
不同workid,datacenterid,1ms能產生2^22 – 1(近420w)個id, 1秒鍾產生42億個id


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM