Commit 2435dae8 authored by zhiguo.liu's avatar zhiguo.liu

fix: 回退 IDGenerator 版本,去掉补位 0 会导致生成号码冲突

parent fb633645
......@@ -39,6 +39,13 @@ public class IDGenerator {
private static final String REDIS_WORK_ID_KEY = "GLOBAL:WORK:ID:";
private static final String ID_FORMAT = "yyyyMMddHHmmss";
private static Lock lock = new ReentrantLock();
/**
* data center,默认为 1
*/
private static int DATA_CENTER_ID = 1;
/**
* 最高支持同时1W台机器
*/
......@@ -47,11 +54,7 @@ public class IDGenerator {
* 最高每秒发号 100w
*/
private static final int MAX_COUNT = 999999;
private static Lock lock = new ReentrantLock();
/**
* data center,默认为 1
*/
private static int DATA_CENTER_ID = 1;
private static AtomicInteger COUNTER = new AtomicInteger(0);
private static long MAX_TIME_SECOND;
......@@ -67,6 +70,12 @@ public class IDGenerator {
* 最长回退时间,120 秒
*/
private static int MAX_BACK_SECOND = 120;
static {
Date now = new Date();
MAX_TIME_SECOND = now.getTime() / 1000;
}
private static LoadingCache cache = CacheBuilder.newBuilder()
.expireAfterWrite(MAX_BACK_SECOND, TimeUnit.SECONDS)
.build(new CacheLoader<Long, AtomicInteger>() {
......@@ -76,14 +85,23 @@ public class IDGenerator {
}
});
static {
Date now = new Date();
MAX_TIME_SECOND = now.getTime() / 1000;
}
@Autowired
private StringRedisTemplate redis;
@Value("${data.center.id}")
public void setDataCenterId(Integer dataCenterId) {
DATA_CENTER_ID = dataCenterId;
}
@PostConstruct
public void init() {
int workerId = (int) (redis.opsForValue().increment(REDIS_WORK_ID_KEY + DATA_CENTER_ID, 1) % MAX_WORK_ID);
WORKER_ID_STR = String.format("%04d", workerId);
DATA_CENTER_STR = String.format("%03d", DATA_CENTER_ID);
}
/**
* 1. 需要获取 dataCenterId 和 workeId
*/
......@@ -128,19 +146,7 @@ public class IDGenerator {
}
String currentTimeStr = new SimpleDateFormat(ID_FORMAT, Locale.SIMPLIFIED_CHINESE).format(now);
return prefix + currentTimeStr + DATA_CENTER_STR + WORKER_ID_STR + counter;
}
@Value("${data.center.id}")
public void setDataCenterId(Integer dataCenterId) {
DATA_CENTER_ID = dataCenterId;
}
@PostConstruct
public void init() {
int workerId = (int) (redis.opsForValue().increment(REDIS_WORK_ID_KEY + DATA_CENTER_ID, 1) % MAX_WORK_ID);
WORKER_ID_STR = String.valueOf(workerId);
DATA_CENTER_STR = String.valueOf(DATA_CENTER_ID);
return prefix + currentTimeStr + DATA_CENTER_STR + WORKER_ID_STR + String.format("%06d", counter);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment