1.UUID
- 全局唯一
- 高性能,高可用低延时,生成要快
- 好接入,接入要简单,拿来即用
- 趋势递增
public static void main(String[] args) {
String uuid = UUID.randomUUID().toString().replaceAll("-","");
System.out.println(uuid);
}
结果如下:d7e0f5f82e484c5a890d4a657ecfaa1f,字符长度为36个字符,若去掉-则为32个字符,没有任何意义。生成简单快速,但查询性能不好。
2.mysql自增ID
当我们需要一个ID的时候,向表中插入一条记录返回主键ID,但这种方式有一个比较致命的缺点,访问量激增时MySQL本身就是系统的瓶颈,无法保证并发请求。
3.Redis 操作是单线程的,因此我们可以利用redis的incr命令实现ID的原子性自增。并且可以解决并发的场景。
package com.othp.core.util;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;
/**
*主键生成服务类
*/
@Slf4j
public class PrimaryKeyService {
/**
* redis服务类
*/
@Autowired
private RedisService redisService;
private static final String UUID_PRE ="uuid_";
/**
*
* 获取主键ID(yyyymmdd(8位日期)+9位数值)
*
* @return 主键ID
*/
public String getUuid() {
Long keyValue = null;
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
String dateStr = DateUtil.convertCalendarToString(calendar, DateUtil.YMD_PATTERN);
StringBuffer keyBuffer = new StringBuffer();
keyBuffer.append(PrimaryKeyService.UUID_PRE);
keyBuffer.append(dateStr);
String uuidKey = keyBuffer.toString();
if(!redisService.exists(uuidKey)) {
keyValue = redisService.incr(uuidKey, 1L);
redisService.setExpires(uuidKey, 172800, TimeUnit.SECONDS);
}else {
keyValue = redisService.incr(uuidKey, 1L);
}
String uuid=dateStr+String.format("%1$09d", keyValue);
log.debug("------------uuid-----------:"+uuid);
return uuid;
}
}