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