JAVA 订单编号+计数器

本文介绍了一种订单编号的生成策略,使用时间戳和计数器结合的方式,确保订单号的唯一性和有序性。订单号由前缀'TD'、17位时间戳和4位计数器组成,通过Redis缓存实现计数器的原子操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
     * 生成订单编号
     * @return 返回类型 订单号
     * @throws Exception
     * @Description: 订单编号:tq + 时间戳(17位) + 四位计数器(4) 一共23位
     */
    public  String makeOrderNo(){
        // 最终生成的订单号
        StringBuffer finOrderNum = new StringBuffer("TD");
        String nowTime = YyDateUtils.formatLocalDateTime(LocalDateTime.now(), "yyyyMMddHHmmssSSS");
        String setTime  = YyDateUtils.formatLocalDateTime(LocalDateTime.now(), "yyyyMMdd");
        if(!redisCache.isExist("orderNum:"+setTime)){
            redisCache.set("orderNum:"+setTime,0,1,TimeUnit.DAYS);
            //设置过期时间
            redisCache.expireKeyAt("orderNum"+setTime,loadLong());
        }

        double num = redisCache.incrNum("orderNum:"+setTime,1);
        NumberFormat formatter  =   NumberFormat.getNumberInstance();
        formatter.setMinimumIntegerDigits(4);
        formatter.setGroupingUsed(false);
        //补位
        String covering =  formatter.format(num);
        // 组装订单号
        finOrderNum.append(nowTime).append(covering);
        return finOrderNum.toString();
    }



   //计数器每天凌晨00:00:00 清除
    public static Date loadLong(){
        Date date = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, 1) ;
        return YyDateUtils.parseDate(YyDateUtils.format(cal.getTime(),"yyyy-MM-dd 00:00:00"));
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值