perf:动态调度数据库保存
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
<artifactId>xservice-basic</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<version>1.0.2-SNAPSHOT</version>
|
||||
|
||||
<artifactId>xservice-common</artifactId>
|
||||
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
package com.xiang.xservice.basic.utils;
|
||||
|
||||
|
||||
public class PrimaryKeyUtils {
|
||||
/**
|
||||
* 自定义起始时间戳,例如 2025-01-01
|
||||
*/
|
||||
private static final long START_TIMESTAMP = 1735660800000L;
|
||||
private static final long DATA_CENTER_ID_BITS = 5L;
|
||||
private static final long WORKER_ID_BITS = 5L;
|
||||
private static final long SEQUENCE_BITS = 12L;
|
||||
|
||||
private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);
|
||||
private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
|
||||
|
||||
private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
|
||||
private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
|
||||
private static final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;
|
||||
|
||||
private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS);
|
||||
|
||||
// 可通过配置设置
|
||||
private static final long DATA_CENTER_ID = 1L;
|
||||
private static final long WORKER_ID = 1L;
|
||||
|
||||
private static long sequence = 0L;
|
||||
private static long lastTimestamp = -1L;
|
||||
|
||||
// 分布式下可使用分布式锁替代 synchronized
|
||||
public static synchronized long snowflakeId() {
|
||||
long timestamp = currentTimestamp();
|
||||
|
||||
if (timestamp < lastTimestamp) {
|
||||
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
|
||||
}
|
||||
|
||||
if (timestamp == lastTimestamp) {
|
||||
sequence = (sequence + 1) & SEQUENCE_MASK;
|
||||
if (sequence == 0) {
|
||||
timestamp = waitNextMillis(timestamp);
|
||||
}
|
||||
} else {
|
||||
sequence = 0L;
|
||||
}
|
||||
|
||||
lastTimestamp = timestamp;
|
||||
|
||||
return ((timestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT)
|
||||
| (DATA_CENTER_ID << DATA_CENTER_ID_SHIFT)
|
||||
| (WORKER_ID << WORKER_ID_SHIFT)
|
||||
| sequence;
|
||||
}
|
||||
|
||||
private static long waitNextMillis(long currentTimestamp) {
|
||||
long timestamp = currentTimestamp();
|
||||
while (timestamp <= currentTimestamp) {
|
||||
timestamp = currentTimestamp();
|
||||
}
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
private static long currentTimestamp() {
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user