'雪花般的分佈式唯一ID--雪花算法'

算法 數據庫 MySQL Scala Java 技術 聚IT 2019-09-08
"
"
雪花般的分佈式唯一ID--雪花算法

導讀:唯一ID可以標識數據的唯一性,在分佈式系統中生成唯一ID的方案有很多,常見的方式大概有以下三種

  • 依賴數據庫,使用如MySQL自增列或Oracle序列等。
  • UUID隨機數
  • snowflake雪花算法(本文將要討論)

一、數據庫和UUID方案的不足之處

採用數據庫自增序列:

  • 讀寫分離時,只有主節點可以進行寫操作,可能有單點故障的風險
  • 分表分庫,數據遷移合併等比較麻煩

UUID隨機數

  • 採用無意義字符串,沒有排序
  • UUID使用字符串形式存儲,數據量大時查詢效率比較低

二、關於雪花算法

有這麼一種說法,自然界中並不存在兩片完全一樣的雪花的。每一片雪花都擁有自己漂亮獨特的形狀、獨一無二。雪花算法也表示生成的ID如雪花般獨一無仁。

"
雪花般的分佈式唯一ID--雪花算法

導讀:唯一ID可以標識數據的唯一性,在分佈式系統中生成唯一ID的方案有很多,常見的方式大概有以下三種

  • 依賴數據庫,使用如MySQL自增列或Oracle序列等。
  • UUID隨機數
  • snowflake雪花算法(本文將要討論)

一、數據庫和UUID方案的不足之處

採用數據庫自增序列:

  • 讀寫分離時,只有主節點可以進行寫操作,可能有單點故障的風險
  • 分表分庫,數據遷移合併等比較麻煩

UUID隨機數

  • 採用無意義字符串,沒有排序
  • UUID使用字符串形式存儲,數據量大時查詢效率比較低

二、關於雪花算法

有這麼一種說法,自然界中並不存在兩片完全一樣的雪花的。每一片雪花都擁有自己漂亮獨特的形狀、獨一無二。雪花算法也表示生成的ID如雪花般獨一無仁。

雪花般的分佈式唯一ID--雪花算法

雪花算法概述

雪花算法生成的ID是純數字且具有時間順序的。其原始版本是scala版,後面出現了許多其他語言的版本如Java、C++等。

組成結構

"
雪花般的分佈式唯一ID--雪花算法

導讀:唯一ID可以標識數據的唯一性,在分佈式系統中生成唯一ID的方案有很多,常見的方式大概有以下三種

  • 依賴數據庫,使用如MySQL自增列或Oracle序列等。
  • UUID隨機數
  • snowflake雪花算法(本文將要討論)

一、數據庫和UUID方案的不足之處

採用數據庫自增序列:

  • 讀寫分離時,只有主節點可以進行寫操作,可能有單點故障的風險
  • 分表分庫,數據遷移合併等比較麻煩

UUID隨機數

  • 採用無意義字符串,沒有排序
  • UUID使用字符串形式存儲,數據量大時查詢效率比較低

二、關於雪花算法

有這麼一種說法,自然界中並不存在兩片完全一樣的雪花的。每一片雪花都擁有自己漂亮獨特的形狀、獨一無二。雪花算法也表示生成的ID如雪花般獨一無仁。

雪花般的分佈式唯一ID--雪花算法

雪花算法概述

雪花算法生成的ID是純數字且具有時間順序的。其原始版本是scala版,後面出現了許多其他語言的版本如Java、C++等。

組成結構

雪花般的分佈式唯一ID--雪花算法

大致由:首位無效符、時間戳差值,機器(進程)編碼,序列號四部分組成。

特點(自增、有序、適合分佈式場景)

  • 時間位:可以根據時間進行排序,有助於提高查詢速度。
  • 機器id位:適用於分佈式環境下對多節點的各個節點進行標識,可以具體根據節點數和部署情況設計劃分機器位10位長度,如劃分5位表示進程位等。
  • 序列號位:是一系列的自增id,可以支持同一節點同一毫秒生成多個ID序號,12位的計數序列號支持每個節點每毫秒產生4096個ID序號

snowflake算法可以根據項目情況以及自身需要進行一定的修改。

"
雪花般的分佈式唯一ID--雪花算法

導讀:唯一ID可以標識數據的唯一性,在分佈式系統中生成唯一ID的方案有很多,常見的方式大概有以下三種

  • 依賴數據庫,使用如MySQL自增列或Oracle序列等。
  • UUID隨機數
  • snowflake雪花算法(本文將要討論)

一、數據庫和UUID方案的不足之處

採用數據庫自增序列:

  • 讀寫分離時,只有主節點可以進行寫操作,可能有單點故障的風險
  • 分表分庫,數據遷移合併等比較麻煩

UUID隨機數

  • 採用無意義字符串,沒有排序
  • UUID使用字符串形式存儲,數據量大時查詢效率比較低

二、關於雪花算法

有這麼一種說法,自然界中並不存在兩片完全一樣的雪花的。每一片雪花都擁有自己漂亮獨特的形狀、獨一無二。雪花算法也表示生成的ID如雪花般獨一無仁。

雪花般的分佈式唯一ID--雪花算法

雪花算法概述

雪花算法生成的ID是純數字且具有時間順序的。其原始版本是scala版,後面出現了許多其他語言的版本如Java、C++等。

組成結構

雪花般的分佈式唯一ID--雪花算法

大致由:首位無效符、時間戳差值,機器(進程)編碼,序列號四部分組成。

特點(自增、有序、適合分佈式場景)

  • 時間位:可以根據時間進行排序,有助於提高查詢速度。
  • 機器id位:適用於分佈式環境下對多節點的各個節點進行標識,可以具體根據節點數和部署情況設計劃分機器位10位長度,如劃分5位表示進程位等。
  • 序列號位:是一系列的自增id,可以支持同一節點同一毫秒生成多個ID序號,12位的計數序列號支持每個節點每毫秒產生4096個ID序號

snowflake算法可以根據項目情況以及自身需要進行一定的修改。

雪花般的分佈式唯一ID--雪花算法

三、雪花算法的缺點

雪花算法在單機系統上ID是遞增的,但是在分佈式系統多節點的情況下,所有節點的時鐘並不能保證不完全同步,所以有可能會出現不是全局遞增的情況。

四、總結

分佈式唯一ID的方案有很多,本文主要討論了雪花算法,組成結構大致分為了無效位、時間位、機器位和序列號位。其特點是自增、有序、純數字組成查詢效率高且不依賴於數據庫。適合在分佈式的場景中應用,可根據需求調整具體實現細節。

感謝您的閱讀,如果喜歡本文歡迎關注和轉發,本頭條號將持續分享IT技術知識。對於文章內容有其他想法或意見建議等,歡迎提出共同討論共同進步。

"

相關推薦

推薦中...