MySQL是一個開源的關系型數據庫管理系統,廣泛應用于互聯網開發中。MySQL的id自增功能是我們經常用到的一個功能,可以幫助我們自動生成唯一的ID。
MySQL中的id自增功能通常會用到AUTO_INCREMENT關鍵字,我們可以在創建表的時候設置id字段為自增長屬性。代碼如下:
CREATE TABLE table_name ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL, PRIMARY KEY (id) );
在使用該表插入數據時,如果不指定id值,系統會自動分配該字段的下一個可用的值。可以使用LAST_INSERT_ID()函數獲取到剛剛插入記錄的id值。
而雪花算法是Twitter提出的一種分布式id生成算法,可以生成唯一、有序、不連續的id。雪花算法的核心思想是將一個64位的二進制數分成不同的部分,每個部分代表不同的意義,再進行處理生成id號。雪花算法生成的ID具有一定的時間序列特性,因此在分布式場景下可以保證高效的ID生成和數據分片。
雪花算法的生成方式可以使用Java語言實現,其核心代碼如下:
public class SnowflakeIdWorker { private static final long START_TIME_MILLIS = 1543229402000L; // 最初時間戳 private static final long SEQUENCE_BITS = 12L; // 序列號的位數 private static final long WORKER_ID_BITS = 5L; // 機器id的位數 private static final long MAX_SEQUENCE_NUM = ~(-1L<< SEQUENCE_BITS); // 序列號最大值 private static final long MAX_WORKER_NUM = ~(-1L<< WORKER_ID_BITS); // 機器id最大值 private static long lastTimeStamp = -1L; // 上次生成ID的時間戳 private static long sequenceNum = 0L; // 當前序列號 private final long workerId; // 機器id public SnowflakeIdWorker(long workerId) { if (workerId >MAX_WORKER_NUM || workerId< 0) { throw new IllegalArgumentException("workerId can't be greater than MAX_WORKER_NUM or less than 0!"); } this.workerId = workerId; } public synchronized long nextId() { long currentTimeMillis = System.currentTimeMillis(); // 獲取當前時間戳 if (currentTimeMillis< lastTimeStamp) { throw new RuntimeException("Clock moved backwards, Refusing to generate id!"); } if (currentTimeMillis == lastTimeStamp) { // 同一毫秒內生成多個id號 sequenceNum = (sequenceNum + 1) & MAX_SEQUENCE_NUM; if (sequenceNum == 0) { // 當前毫秒內序列號已經到達最大值 currentTimeMillis = getNextMillis(); } } else { // 不同毫秒內生成id號 lastTimeStamp = currentTimeMillis; sequenceNum = 0L; } return ((currentTimeMillis - START_TIME_MILLIS)<< (SEQUENCE_BITS + WORKER_ID_BITS)) | (workerId<< SEQUENCE_BITS) | sequenceNum; } private long getNextMillis() { long currentTimeMillis = System.currentTimeMillis(); while (currentTimeMillis<= lastTimeStamp) { currentTimeMillis = System.currentTimeMillis(); } return currentTimeMillis; } }
在使用雪花算法生成id時,我們需要在不同的機器上運行不同的服務實例,每個服務實例有不同的ID號。
兩種id生成方式各有優缺點,在實際開發中應根據需要靈活應用,選擇合適的方式進行數據存儲和操作。