一、雪花演算法ID是什麼
雪花演算法ID是一種用於生成唯一標識符的演算法。它最初由Twitter公司開發,在分散式系統中廣泛使用。雪花演算法ID使用64位整數來表示,它的基本格式如下:
+-----------------------------------------------------------------------+
| 1位符號位 | 41位時間戳 | 10位機器編號 | 12位序列號 |
+-----------------------------------------------------------------------+
其中,符號位佔用1位,時間戳佔用41位,機器編號佔用10位,序列號佔用12位。各部分的含義如下:
- 符號位:0表示正數,1表示負數,由於此ID生成器只生成正整數ID,所以該位恆定為0。
- 時間戳:41位的時間戳,精確到毫秒級別。由於41位的長度足以表示從1970年至2088年的時間,所以可以使用該演算法生成ID長達68年。
- 機器編號:10位的機器標識符,可以用於將ID生成器部署在多台機器上,避免產生重複ID。
- 序列號:12位的自增序列號,每台機器每毫秒最多可生成4096個ID。
二、雪花演算法ID的優點
相比於其他ID生成演算法,雪花演算法ID具有以下幾個優點:
- 全局唯一性:相同的機器在同一毫秒內最多只能生成4096個不同的序列號,避免了ID重複的可能性。
- 有序性:由於ID中包含時間戳信息,因此在分散式系統中可以按照時間戳順序對ID進行排序。
- 高可用性:由於機器編號可以標識不同的機器,保證了在分散式系統中即使某台機器故障,仍然可以生成唯一的ID。
三、如何在MySQL中使用雪花演算法ID
下面我們通過代碼實現,在MySQL資料庫中生成雪花演算法ID。
1、創建存儲過程
DELIMITER //
CREATE PROCEDURE `sp_snowflake_id`(OUT `id` BIGINT)
BEGIN
DECLARE `worker_id` BIGINT DEFAULT 1;
DECLARE `sequence` BIGINT DEFAULT 0;
DECLARE `last_timestamp` BIGINT DEFAULT 0;
SET `last_timestamp` = UNIX_TIMESTAMP() * 1000;
SELECT `data` FROM `snowflake_worker` WHERE `ip` = `LOCALHOST` INTO `worker_id`;
IF `worker_id` IS NULL THEN
INSERT INTO `snowflake_worker`(`ip`, `data`) VALUES (`LOCALHOST`, 1);
END IF;
WHILE TRUE DO
IF `last_timestamp` = UNIX_TIMESTAMP() * 1000 THEN
SET `sequence` = (`sequence` + 1) & 4095;
IF `sequence` = 0 THEN
SET `last_timestamp` = WAIT_UNTIL_NEXT_MILLISECOND(`last_timestamp`);
END IF;
ELSE
SET `last_timestamp` = UNIX_TIMESTAMP() * 1000;
SET `sequence` = 0;
END IF;
SET `id` = ((`last_timestamp` - 1420041600000) << 22)
| (`worker_id` << 12) | `sequence`;
LEAVE WHILE;
END WHILE;
END //
DELIMITER ;
這段存儲過程的功能如下:
- 首先聲明worker_id和sequence,分別表示機器編號和序列號,last_timestamp表示上一次生成ID的時間戳。
- 如果資料庫中不存在當前機器的編號,則將機器編號值初始化為1。
- 進入循環,如果當前時間戳與上次生成ID的時間戳相同,則自增序列號,並判斷序列號是否達到4096,如果達到則等待下一毫秒。
- 如果當前時間戳與上次生成ID的時間戳不同,則表示進入了新的一毫秒,此時將序列號重置為0。
- 最後將四個部分拼接成一個64位整數,並將其作為存儲過程的返回值。
2、創建雪花演算法ID表
CREATE TABLE `snowflake_worker` (
`ip` VARCHAR(15) NOT NULL,
`data` BIGINT NOT NULL,
PRIMARY KEY (`ip`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4;
在這個表中,我們使用ip欄位表示每一台機器的標識符,data欄位表示該機器上生成ID的序列號。
3、調用存儲過程生成ID
CALL `sp_snowflake_id`(@id);
SELECT @id;
調用存儲過程即可生成雪花演算法ID,將返回值保存在一個變數中,通過SELECT語句輸出即可。
四、雪花演算法ID的應用場景
由於雪花演算法ID可以保證全局唯一性、有序性和高可用性,因此在分散式系統中廣泛應用。以下是幾個常見的應用場景:
- 分散式系統中唯一ID的生成。
- 訂單號、交易號的生成。
- 數據記錄的唯一標識符。
五、總結
通過本文的講解,我們詳細介紹了MySQL雪花演算法ID的生成方式、優點、使用方法以及應用場景。在實際的開發過程中,可以根據具體需求進行調整,以達到最優的性能。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301944.html