Redis生成唯一标识
/**使用redis生成唯一ID Start===============================================*/
private DateFormat df = new SimpleDateFormat("yyyyMMdd");
/**
* 起始的时间戳
*/
private final static long START_STMP = 1480166465631L;
/**
* 每天从 1 开始生成唯一标识
*
* @param key 要生成唯一标识的对象
* @param length 要生成为唯一标识后缀的长度。不包括需要附加的时间前缀
* 如果 haveDay = false 或者 length 长度小于标识后缀的长度则无效
* @param haveDay 是否要附加日期前缀
* @return 唯一标识
* @throws Exception 异常
*/
@Override
public Long fetchDailyUUID(String key, Integer length, Boolean haveDay) throws Exception {
Calendar now = new GregorianCalendar();
String day = df.format(now.getTimeInMillis() - START_STMP);
//新的一天,通过新 key 获取值,每天都能从1开始获取
key = key + "_" + day;
Long num = this.getIncreaseNo(key,1);
if(num == 0){
return null;
}
//设置 key 过期时间
if (num == 1) {
this.setKeyExpir(key, ((24 - now.get(Calendar.HOUR_OF_DAY)) * 3600 + 1800)*1000);
}
if (haveDay) {
return createUUID(num, day, length);
} else {
return num;
}
}
/**
* 全局从 1 开始生成唯一标识
*
* @param key 要生成唯一标识的对象
* @param length 要生成为唯一标识后缀的长度。不包括需要附加的时间前缀
* 如果 haveDay = false 或者 length 长度小于标识后缀的长度则无效
* @param haveDay 是否要附加日期前缀。
* @return 唯一标识
* @throws Exception 异常
*/
@Override
public Long fetchUUID(String key, Integer length, Boolean haveDay) throws Exception {
Calendar now = new GregorianCalendar();
Long num = this.getIncreaseNo(key,1);
if(num == 0){
return null;
}
if (haveDay) {
String day = df.format(now.getTimeInMillis() - START_STMP);
return createUUID(num, day, length);
} else {
return num;
}
}
private Long createUUID(Long num, String day, Integer length) {
String id = String.valueOf(num);
if (id.length() < length) {
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
nf.setMaximumIntegerDigits(length);
nf.setMinimumIntegerDigits(length);
id = nf.format(num);
}
return Long.parseLong(day + id);
}
/**使用redis生成唯一ID End===============================================*/
@GetMapping("/getUUID1")
public Long getUUID1() throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
System.out.println(redisService.fetchDailyUUID("USER",8,true));
}
System.out.println(System.currentTimeMillis() - start);
return System.currentTimeMillis() - start;
}
@GetMapping("/getUUID2")
public Long getUUID2() throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
System.out.println(redisService.fetchUUID("USER",8,true));
}
System.out.println(System.currentTimeMillis() - start);
return System.currentTimeMillis() - start;
}