UidGenerator 是用 Java 語言實(shí)現(xiàn)的基于 Snowflake 算法的唯一 ID 生成器果复。
UidGenerator 是以組件形式工作在應(yīng)用項(xiàng)目中, 支持自定義 workerId 位數(shù)和初始化策略, 從而適用于 Docker 等虛擬化環(huán)境下實(shí)例自動重啟筏勒、漂移等場景横侦。在實(shí)現(xiàn)上臼寄,UidGenerator 通過借用未來時(shí)間來解決 Sequence 天然存在的并發(fā)限制纺腊;采用 RingBuffer 來緩存已生成的 UID, 并行化 UID 的生產(chǎn)和消費(fèi),利职,同時(shí)對 CacheLine 補(bǔ)齊滔灶,避免了由 RingBuffer 帶來的硬件級「偽共享」問題送膳,最終單機(jī) QPS 可達(dá)600萬员魏。
Github地址:uid-generator
uid-generator 使用的就是 snowflake,只是在生產(chǎn)機(jī)器 id叠聋,也叫做 workId 時(shí)有所不同撕阎。
uid-generator 中的 workId 是由 uid-generator 自動生成的,并且考慮到了應(yīng)用部署在 docker 上的情況碌补,在 uid-generator 中虏束,用戶可以自己去定義 workId 的生成策略,默認(rèn)提供的策略是:應(yīng)用啟動時(shí)由數(shù)據(jù)庫分配厦章。說的簡單就是:應(yīng)用在啟動時(shí)會往數(shù)據(jù)庫表 ( uid-generator 需要新增 WORKER_NODE 表)中去插入一條數(shù)據(jù)镇匀,數(shù)據(jù)插入成功后,返回的自增唯一 id 就是該機(jī)器的 workId袜啃,而數(shù)據(jù)由 host 和 port 組成汗侵。
對于 uid-generator 中的 workId,占用了22個(gè) bit 位群发,時(shí)間占用了28個(gè) bit 位晰韵,序列化占用了13個(gè) bit 位,需要注意的是熟妓,和原始的 snowflake 不太一樣宫屠,時(shí)間的單位是秒,而不是毫秒滑蚯,workId 也不一樣浪蹂,同一個(gè)應(yīng)用每重啟一次就會消費(fèi)一個(gè) workId。