色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

mysql id自增和雪花算法

呂致盈2年前14瀏覽0評論

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生成方式各有優缺點,在實際開發中應根據需要靈活應用,選擇合適的方式進行數據存儲和操作。