1、字符串id组成
前缀+当日时间+自定义的位数
2、方法
@Component
public class MyFlake {
public static final SimpleDateFormat SHORT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
//注入RedisTemplate
private static StringRedisTemplate redisTemplate;
private static final Integer number = 4; //id的最后自增的自定义位数
private static final String PREFIX = "DT"; //编号的前缀
@Autowired
public void setRedisTemplate(StringRedisTemplate redisTemplate) {
MyFlake.redisTemplate = redisTemplate;
}
public String getCalculationIds(String prefix) {
String dateStr = getDateTime().replaceAll("-", "");
if (prefix == null || prefix.trim().equals("")) {
prefix = PREFIX;
}
//从redis中拿到当天的最大id
String maxId = redisTemplate.opsForValue().get(dateStr);
if (maxId == null) {
maxId = getNumber(0, number);
}
String id = addId(maxId);
redisTemplate.opsForValue().set(dateStr, id);
String ids = prefix + dateStr + id;
return ids;
}
//拿到最后一个id,进行id增长计算
private String addId(String id) {
int length = id.length();
Integer integer = Integer.valueOf(id);
integer += 1;
return getNumber(integer, length);
}
//id自动补零
private static String getNumber(int number, Integer figure) {
NumberFormat numberInstance = NumberFormat.getNumberInstance();
numberInstance.setMinimumIntegerDigits(figure);
numberInstance.setGroupingUsed(false);
return numberInstance.format(number);
}
private static String getDateTime() {
return SHORT_DATE_FORMAT.format(new Date());
}
}
3、测试
@Test
public void test3(){
MyFlake myFlake = new MyFlake();
System.out.println(myFlake.getCalculationIds(""));
}
此次测试代码是结合redis,也可结合数据库,实现方式变动不大,可适当修改,按需取用
DT202104280004