MySQL 雪花算法是一種生成分布式唯一ID的算法,具有高效、穩定的特性,在分布式的場景下應用廣泛。
它的原理是在一個64位的整數中,各個 bit 位都有它獨立的意義,可以使用不同的位組合存儲不同的信息,其中包括時間戳、機器ID、序列號等等。
在使用 MySQL 雪花算法時,最關鍵的一點是機器ID的唯一性,因為這個 ID 會作為生成唯一ID的一個部分,如果出現重復,將會導致生成相同的 ID。
CREATE TABLE `id_generator` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
上面這段 SQL 語句展示了一種創建雪花算法唯一ID的表結構,將 ID 列的自增特性去掉后,可以使用雪花算法生成唯一ID。
在實際使用過程中,為了提高性能,可以將每臺機器生成的序列號緩存一定時間,避免每次都從數據庫中去查詢。
public class IdGenerator {
private static final long TWEPOCH = 1483200000000L;
private static final long WORKER_ID_BITS = 10L;
private static final long MAX_WORKER_ID = ~(-1L<< WORKER_ID_BITS);
private static long workerId = 0L;
private static long sequence = 0L;
private static long lastTimestamp = -1L;
private static final Object lock = new Object();
public static void setWorkerId(long workerId) {
IdGenerator.workerId = workerId;
}
public static synchronized long nextId() {
long timestamp = System.currentTimeMillis();
if (timestamp< lastTimestamp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
}
if (lastTimestamp == timestamp) {
sequence = (sequence + 1) & ~(-1L << 12);
if (sequence == 0) {
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = timestamp;
long nextId = ((timestamp - TWEPOCH)<< 22) | (workerId << WORKER_ID_BITS) | sequence;
return nextId;
}
private static long tilNextMillis(long lastTimestamp) {
long timestamp = System.currentTimeMillis();
while (timestamp <= lastTimestamp) {
timestamp = System.currentTimeMillis();
}
return timestamp;
}
}
這段代碼展示了一個簡單的雪花算法實現,其中提供了 setWorkerId 方法可以設置對應機器的唯一ID。
總的來說,MySQL 雪花算法是一個高效、穩定、分布式的唯一ID生成方式,可以廣泛應用于分布式系統中。
上一篇css生成器什么意思
下一篇mysql 零時數據