Java生成唯一订单号的几种方式

 更新时间:2025年03月21日 09:28:40   作者:周董思密达  
这篇文章主要介绍了Java生成唯一订单号的几种方式,订单号具有唯一标识符的作用,下边将演示自增、随机、组合的方式,生成高效、安全、唯一的订单号,以满足业务需求和避免潜在问题,需要的朋友可以参考下

前言

订单号具有唯一标识符的作用,下边将演示自增、随机、组合的方式,生成高效、安全、唯一的订单号,以满足业务需求和避免潜在问题。

自增

自增常见的有:纯数字自增时间+数字自增数据库主键id自增

纯数字自增

需求:生成8位自增数字的订单号,不足8位前缀补0。

实现:使用redis的incr函数完成此需求。

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {
    @Resource
    private RedisTemplate<String, Integer> redisTemplate;
    private static final String TEST_ORDER_CODE_KEY = "test_order_code_key";

    @GetMapping("/test")
    public String test() {
        //使用incr获取自增的订单号
        Long increment = redisTemplate.opsForValue().increment(TEST_ORDER_CODE_KEY);
        //将订单号不足8位前缀补0,"%08d",%0表示前缀补0,8表示补充8位,d表示数字类型
        String oderCode = String.format("%08d", increment);
        return oderCode;
    }
}
输出结果:00000001

时间+数字自增

需求:使用年月日(yyMMdd)当订单号前缀,后四位使用当日订单号自增。

实现:获取yyMMdd格式的时间字符串,然后将该字符串作为redis的key使用,并给该key设置一天的过期时间。后四位数字自增使用redis的 incr函数实现。

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {
    @Resource
    private RedisTemplate<String, Integer> redisTemplate;
    private static final String TEST_ORDER_CODE_KEY = "test_order_code_key";

    @GetMapping("/test")
    public String test() {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMdd");
        //根据当前时间获取yyMMdd格式的时间字符串
        String format = LocalDate.now().format(formatter);
        //判断是否存在key,不存在则设置1天的过期时间
        if (Boolean.FALSE.equals(redisTemplate.hasKey(format))) {
            redisTemplate.expire(format, 1, TimeUnit.DAYS);
        }
        //使用incr获取自增的订单号
        Long increment = redisTemplate.opsForValue().increment(format);
        //将订单号不足4位前缀补0,"%04d",%0表示前缀补0,4表示补充4位,d表示数字类型
        String oderCode = String.format("%04d", increment);
        return format + oderCode;
    }
}
输出结果:2412260001

数据库主键id自增

需求:生成8位自增数字的订单号,不足8位前缀补0。

实现:使用数据库自增主键实现该需求。先保存订单到数据库,取订单id,再将id前缀补0操作后更新到数据库中。

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {
    @Resource
    private OrdersMapper orderMapper;

    @GetMapping("/test")
    public String test() {
        //保存订单,并获取id
        OrdersDO ordersDO = new OrdersDO();
        orderMapper.insert(ordersDO);
        Long id = ordersDO.getId();
        //将订单号不足8位前缀补0,"%08d",%0表示前缀补0,8表示补充8位,d表示数字类型
        String oderCode = String.format("%08d", id);
        //更新订单号
        orderMapper.updateById(ordersDO.setOrderCode(oderCode));
        return oderCode;
    }
}
输出结果:00000001

随机

随机常见的有:随机数UUID分布式全局唯一id(雪花算法)

随机数

需求:生成随机的订单号。

实现:使用Random生成随机数。

import cn.hutool.core.util.RandomUtil;

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {
    @Resource
    private OrdersMapper orderMapper;

    @GetMapping("/test")
    public String test() {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMdd");
        //根据当前时间获取yyMMdd格式的时间字符串
        String format = LocalDate.now().format(formatter);
        //生成随机8位数字
        String random = RandomUtil.randomNumbers(8);
        //时间+随机数组成订单号
        String oderCode = format + random;
        //判断生成的订单号在数据库中是否存在,如果存在则继续随机生成订单号
        while (orderMapper.selectCount(Wrappers.lambdaQuery(OrdersDO.class).eq(OrdersDO::getOrderCode, oderCode)) > 0){
            oderCode = format + RandomUtil.randomNumbers(8);
        }
        return oderCode;
    }
}
输出结果:24122683230048

UUID

需求:生成随机的订单号。

实现:使用UUID实现该需求。

import java.util.UUID;

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {

    @GetMapping("/test")
    public String test() {
        // 生成一个UUID
        UUID uuid = UUID.randomUUID();
        // 将UUID转换为字符串,并移除分隔符
        String oderCode = uuid.toString().replace("-", "");
        return oderCode;
    }
}
输出结果:8a45cd3458b640789ed3c9ef223d090b

分布式全局唯一id(雪花算法)

需求:生成随机的订单号。

实现:使用分布式全局唯一id(雪花算法)实现该需求。

import cn.hutool.core.lang.Snowflake;

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {

    @GetMapping("/test")
    public String test() {
        // 创建一个雪花算法ID生成器实例,通常你需要指定终端ID和数据中心ID
        Snowflake snowflake = new Snowflake(1, 1);
        String oderCode = snowflake.nextIdStr();
        return oderCode;
    }
}
输出结果:1872140136729415680

结语

到此这篇关于Java生成唯一订单号的几种方式的文章就介绍到这了,更多相关Java生成唯一订单号内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RocketMQ消息丢失的场景以及解决方案

    RocketMQ消息丢失的场景以及解决方案

    Apache RocketMQ是企业级的消息中间件,以其高性能和高可靠性而广泛应用,但是,消息丢失的问题在实践中仍然存在,本文将探讨此问题并提供解决方案,需要的朋友可以参考下
    2023-11-11
  • Java实现读写文件功能的代码分享

    Java实现读写文件功能的代码分享

    这篇文章主要为大家详细介绍了如何利用Java语言实现读写文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • 深度理解Java中volatile的内存语义

    深度理解Java中volatile的内存语义

    前面我们已经讲过了volatile的作用、底层实现与内存屏障,下面就总结一下整个流程,文中有非常详细的介绍及图文示例,需要的朋友可以参考下
    2021-06-06
  • Java SSM实现前后端协议联调详解上篇

    Java SSM实现前后端协议联调详解上篇

    首先我们已经知道,在现在流行的“前后端完全分离”架构中,前后端联调是一个不可能避免的问题,这篇文章主要介绍了Java SSM实现前后端协议联调过程
    2022-08-08
  • 浅谈升级Spring Cloud到Finchley后的一点坑

    浅谈升级Spring Cloud到Finchley后的一点坑

    这篇文章主要介绍了浅谈升级Spring Cloud到Finchley后的一点坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Triple协议支持Java异常回传设计实现详解

    Triple协议支持Java异常回传设计实现详解

    这篇文章主要为大家介绍了Triple协议支持Java异常回传设计实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java中SPI的一些理解

    Java中SPI的一些理解

    这篇文章主要介绍了Java中SPI的一些理解,帮助大家更好的理解和学习Java的相关知识,感兴趣的朋友可以了解下
    2020-12-12
  • Java应用程序的CPU使用率飙升原因详细分析

    Java应用程序的CPU使用率飙升原因详细分析

    这篇文章主要介绍了Java应用程序的CPU使用率飙升原因详细分析,在 Java 中,我们使用 JVM 进行线程调度,所以一般来说,线程的调度有两种模式:分时调度和抢占式调度,线程和进程在阻塞或者等待时,都不会使用 CPU 资源,需要的朋友可以参考下
    2024-01-01
  • Java I/O (Input/Output)文件字节流举例详解

    Java I/O (Input/Output)文件字节流举例详解

    Java的输入输出流(IO)是用于与外部设备(如文件、网络连接等)进行数据交互的机制,下面这篇文章主要给大家介绍了关于Java I/O (Input/Output)文件字节流的相关资料,需要的朋友可以参考下
    2024-08-08
  • SpringBoot整合Swagger2的步骤详解

    SpringBoot整合Swagger2的步骤详解

    这篇文章主要介绍了SpringBoot整合Swagger2的步骤详解,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-04-04

最新评论