需求说明
需要做一个简单的订单号生成规则,并发量不是特别高,从订单号上不要体现出订单的真实数量(例如自增长的ID就会暴露订单数量给用户看到)
实现
示例我是写的订单号生成器,生成类似这样子的2209168334815496的16位订单号。
/** * @author Terry E-mail: yaoxinghuo at 126 dot com * @date 2022/3/4 22:57 * @description */ public class OrderUtils { private static int serial = 0; // 序列号倒数5位的前2位 public static int getSerial() { if (serial >= 99) { serial = 0; } serial++; return serial; } // 生成订单号 public static String generateOrderNo() { Calendar calendar = Calendar.getInstance(); String string1 = new SimpleDateFormat("yyMMdd").format(calendar.getTime()); int seconds = calendar.get(Calendar.HOUR_OF_DAY) * 3600 + calendar.get(Calendar.MINUTE) * 60 + calendar.get(Calendar.SECOND); return string1 + seconds + new DecimalFormat("00").format(getSerial()) + new DecimalFormat("000").format(new Random().nextInt(1000)); } }
算法图形说明如下:
这个在一秒内如果没有很多并发的情况下,是非常充足的,优点是算法简单易用,当然如果有大量的并发,推荐使用雪花算法,详见:https://blog.terrynow.com/2022/09/14/distributed-id-generator-twitter-snow-flake-introduce-and-examples-with-java/
文章评论