1. 程式人生 > >一個類似 Twitter 雪花算法 的 連續序號 ID 產生器 SeqIDGenerator

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

項目 tor 之間 集群 fig 21點 計算 我們 高效

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

今天 QQ 群 裏有網友問起產生唯一 ID 的方法 有哪些, 討論了各種方法 。

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

我覺得 GUID 的 優點 是 簡單 高效, 缺點 是 可讀性 比較差 。

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

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

如果 對 可讀性 沒什麽要求, 那麽 用 GUID 就行 。 或者說, 對 可讀性 沒太多要求 的 場合 可以 通用 GUID 。

但很多時候 我們 也希望使用 可讀性好的 連續序號 ID , 所以就想有一個 簡單的 通用的 產生 連續序號 ID 的 方法 。

所以, 就想出了一個 和 Twitter 雪花算法 類似 的 算法 :

這種算法 產生的 ID 格式如下 :

時間戳-機器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 項目 就可看到)

技術分享圖片

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