一個相似 Twitter 雪花算法 的 連續序號 ID 產生器 SeqIDGenerator

項目地址 :     https://github.com/kelin-xycs/SeqIDGeneratorgit

 

今天 QQ 羣 裏有網友問起產生惟一 ID 的方法 有哪些,  討論了各類方法 。github

 

有網友提到 Twitter 的 雪花算法 :       https://blog.csdn.net/w200221626/article/details/52064976算法

 

我以爲 GUID 的 優勢 是 簡單 高效, 缺點 是 可讀性 比較差 。數據庫

高效 是指 相比起 要到 數據庫 讀取 種子(當前最大序號) 等的方式,  同時 也 簡單,  不會出什麼問題 。服務器

若是 對 可讀性 有要求, 好比 要 顯示給 用戶 看,  或者 便於 維護,  可使用 針對業務 產生的 連續序號 ID , 好比 訂單號 。併發

若是 對 可讀性 沒什麼要求, 那麼 用 GUID 就行 。 或者說, 對 可讀性 沒太多要求 的 場合 能夠 通用  GUID 。負載均衡

 

但不少時候 咱們 也但願使用 可讀性好的 連續序號 ID ,  因此就想有一個 簡單的 通用的 產生 連續序號 ID 的 方法 。高併發

因此, 就想出了一個 和 Twitter 雪花算法 相似 的 算法 :spa

這種算法 產生的 ID 格式以下 :.net

 

時間戳-機器ID-序號

 

時間戳 就是 「20181106213913983」  這樣,  表示  2018年11月06日21點39分13秒983毫秒  ,     時間戳 取到 毫秒 。

機器ID 就是 計算機 ID, 或者說 服務器 ID,  由於如今 高併發 負載均衡 集羣 很常見, 因此須要考慮 多臺 Server 並行做業 時 的 狀況 。 並行做業 的 Server 之間的 連續序號 ID 不能重複, 對此, Twitter 雪花算法 是 經過 給 每一個 Server 一個 機器ID 來區分 , 因此 咱們 也學 Twitter 雪花算法 這樣 。

機器ID 在 App.config 中 配置 : 

 

機器ID 能夠 本身隨便配置, 不過考慮到 連續序號 ID 的 排序 查詢 等,  取成 固定位數 的 數字 比較好 ,  好比 上圖 中的  「0000」,

4 位 數字 能夠支持  1 萬  臺 Server  (0000 ~ 9999) 。

 

序號 是指 這臺計算機上 當前這一毫秒 內 連續序號 ID 的 序號, 這一毫秒內 第一個 連續序號 ID 的 序號 是 0, 第二個是 1, 第三個是 2, 第四個是 3  ……   ,  以此類推 。 到下一毫秒 序號 會重置爲 從 0 從新開始 。 

如今程序中寫死的 序號 格式 是 4 位 數字,  4 位 數字 能夠支持在  一臺計算機(多核)上   每毫秒 產生  1 萬  個  ID  (0000 ~ 9999)  。

 

效果以下 :        (運行 解決方案 中的 Demo 項目 就可看到)

 

相關文章
相關標籤/搜索