數(shù)據(jù)庫 ID 生成方案:百度 UidGenerator

UidGenerator 是用 Java 語言實現(xiàn)的基于 Snowflake 算法的唯一 ID 生成器。

UidGenerator 是以組件形式工作在應用項目中, 支持自定義 workerId 位數(shù)和初始化策略, 從而適用于 Docker 等虛擬化環(huán)境下實例自動重啟、漂移等場景。在實現(xiàn)上,UidGenerator 通過借用未來時間來解決 Sequence 天然存在的并發(fā)限制;采用 RingBuffer 來緩存已生成的 UID, 并行化 UID 的生產和消費,,同時對 CacheLine 補齊,避免了由 RingBuffer 帶來的硬件級「偽共享」問題,最終單機 QPS 可達600萬。

Github地址:uid-generator

uid-generator 使用的就是 snowflake,只是在生產機器 id,也叫做 workId 時有所不同。

uid-generator 中的 workId 是由 uid-generator 自動生成的,并且考慮到了應用部署在 docker 上的情況,在 uid-generator 中,用戶可以自己去定義 workId 的生成策略,默認提供的策略是:應用啟動時由數(shù)據(jù)庫分配。說的簡單就是:應用在啟動時會往數(shù)據(jù)庫表 ( uid-generator 需要新增 WORKER_NODE 表)中去插入一條數(shù)據(jù),數(shù)據(jù)插入成功后,返回的自增唯一 id 就是該機器的 workId,而數(shù)據(jù)由 host 和 port 組成。

對于 uid-generator 中的 workId,占用了22個 bit 位,時間占用了28個 bit 位,序列化占用了13個 bit 位,需要注意的是,和原始的 snowflake 不太一樣,時間的單位是秒,而不是毫秒,workId 也不一樣,同一個應用每重啟一次就會消費一個 workId。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容