分佈式ID生成總結

1.數據庫自增id

新建一個公共庫,庫裏面新建一個序列表,主鍵id自增,每次請求增長數據都往這個表中插入數據,而後獲取到id,而後使用便可。redis

優勢:方便簡單算法

缺點:單庫生成自增id,高併發下,會有瓶頸數據庫

適用場景:併發

併發很低,幾百/s,不會出現性能瓶頸app

2.UUID

優勢:本地生成,不基於任何第三方分佈式

缺點:高併發

  • 太長,做爲數據庫主鍵性能太差,不適合做爲主鍵
  • 不具備有序性,會致使B+樹索引在寫的時候有過多的隨機寫操做(連續的id能夠產生部分順序寫)
  • 寫的時候不能產生有順序的 append 操做,而須要進行 insert 操做,將會讀取整個 B+ 樹節點到內存,在插入這條記錄後會將整個節點寫回磁盤,這種操做在記錄佔用空間比較大的狀況下,性能降低明顯

適用場景:性能

隨機生成文件名、編號,生成token等。ui

3.系統時間+拼接業務字段值

例如:當前時間戳 + 用戶id + 業務含義編碼,併發高的時候,會有重複,此時就不行了,不建議使用。編碼

4.Redis

Redis是單線程的,因此也能夠用生成全局惟一的ID。能夠用Redis的原子操做 INCR和INCRBY來實現。

優勢:

  • 不依賴於數據庫,靈活方便,且性能優於數據庫。
  • 數字ID自然排序,對分頁或者須要排序的結果頗有幫助。

缺點:

  • 因爲redis是內存的KV數據庫,即便有AOF和RDB,可是依然會存在數據丟失,有可能會形成ID重複。
  • 依賴於redis,redis要是不穩定,會影響ID生成。

5.snowflake算法

twitter開源的分佈式id生成算法,把一個64位的long型的id,1個bit是不用的,用其中的41 bit做爲毫秒數,用10 bit做爲工做機器id,12 bit做爲序列號,理論上最多支持1024臺機器每秒生成4096000個序列號。

1571121818537

  • 1 bit:不用
    由於二進制裏第一個bit爲若是是1,那麼都是負數,可是咱們生成的id都是正數,因此第一個bit統一都是0
  • 41 bit:表示的是時間戳,單位是ms
    41 bit能夠表示的數字多達2^41 - 1,也就是能夠標識2 ^ 41 - 1個毫秒值,換算成年就是表示69年的時間
  • 10 bit:記錄工做機器id
    表明的是這個服務最多能夠部署在2^10臺機器上哪,也就是1024臺機器,可是10 bit裏5個bit表明機房id,5個bit表明機器id。意思就是最多表明2 ^ 5個機房(32個機房),每一個機房裏能夠表明2 ^ 5個機器(32臺機器)。
  • 12 bit:記錄同一個毫秒內產生的不一樣id
    12 bit能夠表明的最大正整數是2 ^ 12 - 1 = 4096,也就是說能夠用這個12bit表明的數字來區分同一個毫秒內的4096個不一樣的id

缺點:

依賴於系統時鐘的一致性。若是某臺機器的系統時鐘回撥,有可能形成ID衝突,或者ID亂序、ID重複

優勢:

  • 生成ID時不依賴於數據庫,徹底在內存生成,高性能高可用
  • 容量大,每秒可生成幾百萬ID
  • ID呈趨勢遞增,後續插入數據庫的索引樹的時候,性能較高
相關文章
相關標籤/搜索