利用时间实现字符串id唯一且自增

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值