首頁>技術>

GUID是用Java語言實現的全域性唯一ID演算法,它基於Twitter的雪花演算法SnowFlake。不僅可以使用於單機環境,更適用於分散式/叢集環境中生成全域性唯一的ID。已經在公司內部使用。

1. 特點

GUID演算法具有以下特點:

高效能:單節點,100萬/秒遞增:各節點按時間趨勢遞增長度短:64位長度的long型別整數,十進位制表示時最長19位高可用:各節點獨立生成ID可配置:各組成部分的長度可以根據需要在環境變數裡配置可解析:ID可以被解析出各個組成部分輕量部署:分散式或叢集環境裡只需要為每臺機器/JVM配置兩個環境變數(資料中心ID和機器ID),不依賴資料庫2. ID結構

guid生成的ID包括6個部分: 0 - 41位時間戳 - 3位資料中心標識 - 7位機器標識 - 2位保留位 - 10位序列號

1為標識,0表示正數。41位時間戳,當前時間的毫秒減去開始時間戳(2020-01-01 00:00:00)。可用 (2 ^ 41) / (1000L * 60 * 60 * 24 * 365) = 69年。3位資料中心標識,可支援(2 ^ 3) = 8個數據中心。7位機器標識,每個資料中心可支援(2 ^ 7) = 128個機器標識。2位時鐘回撥次數,可支援(2 ^ 2 - 1) = 3次時鐘回撥。10位序列號,每個節點每一毫秒支援(2 ^ 10) = 1024個序列號。3. 引數配置

環境變數中可以配置以下引數,其中UUID_WORKER_ID必須配置,而且必須唯一:

引數名引數Key必需預設值機器IDUUID_WORKER_ID是無資料中心IDUUID_DATACENTER_ID否0時間戳起點UUID_START_EPOCH否2020-01-01 00:00:00時鐘回撥閾值UUID_CLOCK_BACK_THRESHOLD否50L時間戳長度UUID_TIMESTAMP_LEN否41L資料中心長度UUID_DATACENTER_ID_LEN否3L機器ID長度UUID_WORKER_ID_LEN否7L時鐘回撥次數長度UUID_REMAIN_LEN否2L序列號長度UUID_SEQUENCE_LEN否10L

各部分的長度可以定製:時間戳長度、資料中心長度、機器長度、時鐘回撥次數長度、序列號長度,總長是63

4. 用法maven依賴

下載程式碼後本地編譯打包上傳到本地倉庫

<dependency>    <groupId>com.abc</groupId>    <artifactId>guid</artifactId>    <version>1.0</version></dependency>
配置機器ID使用時需要為當前機器/JVM設定環境變數:GUID_WORKER_ID叢集環境下啟動時需要執行以下兩個指令碼檔案:

src/main/resources/start_guid.sh:根據IP地址設定集群裡所有機器的ID

export GUID_DATACENTER_ID=1export IP_192_168_1_100_GUID_WORKER_ID=1export IP_192_168_1_101_GUID_WORKER_ID=2

src/main/resources/start.sh:叢集機器啟動指令碼,根據本機IP地址從start_guid.sh獲得機器ID設定為環境變數

BASEDIR=$(cd "$(dirname "$0")"; pwd)if [ -f "${BASEDIR}/start_guid.sh" ];then. ${BASEDIR}/start_guid.shIP_ADDRESS=`hostname -i`GUID_WORKER_ID_NAME=IP_${IP_ADDRESS//\./\_}_GUID_WORKER_IDexport GUID_WORKER_ID=$(eval echo '$'"$GUID_WORKER_ID_NAME")fi
獲得ID
long id = GIDGenerator.nextId();

結果:113274030270189578

解析ID
String str = GUIDGenerator.id2Str(113274030270189578L);

結果:20201108T21:50:33.346-0-1-0-10

5. JMH測試結果
Benchmark                                 Mode  Cnt     Score     Error   UnitsGUIDGeneratorBenchmarkTest.testNextId    thrpt   10  1023.263 ±   4.812  ops/ms

14
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python如何開發 App?