perf:动态调度数据库保存

This commit is contained in:
xiang
2025-07-27 23:46:31 +08:00
parent 6e0154bfe9
commit 4787e03535
11 changed files with 148 additions and 12 deletions

View File

@@ -8,6 +8,7 @@
<artifactId>xservice-basic</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<version>1.0.2-SNAPSHOT</version>
<artifactId>xservice-common</artifactId>

View File

@@ -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();
}
}