ID生成器 雪花算法
背景:在很多業(yè)務場景下,我們都需要一個唯一的 ID 來進行一些數(shù)據(jù)的交互,那么如何生成這個唯一的 ID 呢?
如果在單機的情況下,生成唯一ID,可以利用機器內(nèi)存的特點,通過內(nèi)存分配即可。但我們線上的服務部署往往是多機器、多集群的。在這種情況下就要考慮分布式 ID 生成器了。如何確保數(shù)據(jù)唯一就顯得很重要。
1、數(shù)據(jù)庫自增ID
最簡單,使用最廣泛的場景:單表設置一個自增 ID,我們很多情況下的數(shù)據(jù)查詢、獲取都是通過該方式。
但存在較明顯的弊端:
1、受限于DB最大連接數(shù),高并發(fā)場景下會占用連接數(shù),增加DB壓力。而且主從延遲的情況下會出現(xiàn)數(shù)據(jù)獲取不準確的問題。
2、單表數(shù)據(jù)越來越大, 后期分庫分表會存在壓力,拓展能力差。
2、UUID
UUID是指在一臺機器上生成的數(shù)字,它保證對在同一時空中的所有機器都是唯一的。
UUID由以下幾部分組成:
1、當前日期時間。
2、時鐘序列。
3、全局唯一的IEEE機器識別號,如果有網(wǎng)卡從網(wǎng)卡MAC地址獲得,沒有網(wǎng)卡以其他方式獲得。
UUID目前使用普遍的是微軟的GUID,其格式如下:
xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每個 x 是 0-9 或 a-f 范圍內(nèi)的一個十六
進制的數(shù)字。
示例:b6489592-4726-4d68-a52b-63e2bbddfbf3 1~8位采用系統(tǒng)時間,在系統(tǒng)時間上精確到毫秒級保證時間上的惟一性; 9~16位采用底層的IP地址,在服務器集群中的惟一性; 17~24位采用當前對象的HashCode值,在一個內(nèi)部對象上的惟一性; 25~32位采用調(diào)用方法的一個隨機數(shù),在一個對象內(nèi)的毫秒級的惟一性。復制代碼標準的UUID格式:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)
注:關于 java 的 orm 不討論。
缺點:
1、生成的結果串會比較長。
3、雪花算法
SnowFlake算法生成的唯一 id 是一個64bit大小的整數(shù),它的結構如下圖:
41bit?(0,?2^41)?1589206824687?12bit??組成部分如下:
1、1bit 位不用,因為對于long類型,二進制中最高位是符號位,1代表負,0代表正。
2、41bit 時間位,記錄的為毫秒級別的時間戳。取值范圍為 (0, 2^41) ,舉例:
當前毫秒級別時間戳:1589206824687 bit位表示:101110010000001000001101110110110111011113、10bit 機器 id (可劃分為 5bit 的 datacenterId,5bit 的工作 workerId)
4、12bit 的序列號,用來記錄同毫秒內(nèi)產(chǎn)生的不同 id。
優(yōu)勢:
1、可以按照時間趨勢遞增
2、中間的機器位可以配合業(yè)務靈活的分配到其它位上,也可以借用其它區(qū)塊的bit位
3、分布式系統(tǒng)內(nèi)不會存在相同的兩個id,因為有datacenterId、workerId來保證
缺點:
1、單機器出現(xiàn)時鐘回撥,可能會出現(xiàn) ID 沖撞。如何解決?可利用拓展位進行回撥記錄。
來源:江湖百曉生
https://juejin.cn/post/6844904153894879239
總結
以上是生活随笔為你收集整理的ID生成器 雪花算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 连接工具(linux系统连接
- 下一篇: C/C 输入输出缓冲区