利用时间实现字符串id唯一且自增
1、字符串id组成
前缀+当日时间+自定义的位数
2、方法
@Component
public class MyFlake {public static final SimpleDateFormat SHORT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");//注入RedisTemplateprivate static StringRedisTemplate redisTemplate;private static final Integer number = 4; //id的最后自增的自定义位数private static final String PREFIX = "DT"; //编号的前缀@Autowiredpublic 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中拿到当天的最大idString 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、测试
@Testpublic void test3(){MyFlake myFlake = new MyFlake();System.out.println(myFlake.getCalculationIds(""));}
此次测试代码是结合redis,也可结合数据库,实现方式变动不大,可适当修改,按需取用
DT202104280004
利用时间实现字符串id唯一且自增
1、字符串id组成
前缀+当日时间+自定义的位数
2、方法
@Component
public class MyFlake {public static final SimpleDateFormat SHORT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");//注入RedisTemplateprivate static StringRedisTemplate redisTemplate;private static final Integer number = 4; //id的最后自增的自定义位数private static final String PREFIX = "DT"; //编号的前缀@Autowiredpublic 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中拿到当天的最大idString 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、测试
@Testpublic void test3(){MyFlake myFlake = new MyFlake();System.out.println(myFlake.getCalculationIds(""));}
此次测试代码是结合redis,也可结合数据库,实现方式变动不大,可适当修改,按需取用
DT202104280004