本文共 1673 字,大约阅读时间需要 5 分钟。
/** * 生成唯一的订单号: * */public class OrderUtils { /** 订单号生成 **/ private static ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai"); /** 订单号开始节点 */ private static final AtomicInteger SEQ = new AtomicInteger(1000); private static final DateTimeFormatter DF_FMT_PREFIX = DateTimeFormatter.ofPattern("yyMMddHHmmss"); /** * 生成订单号 * @return */ public static String generateOrderNo(){ LocalDateTime dataTime = LocalDateTime.now(ZONE_ID); // 这里支持多少并发 由这里填写的数字决定 if(SEQ.intValue() > 9000){ SEQ.getAndSet(1000); } // String.format("%4d", andIncrement).replace(" ", "0"); return dataTime.format(DF_FMT_PREFIX)+ SEQ.getAndIncrement(); } /** * 这里测试的是 并发数量为 8000 */ public static void main(String[] args) { ListorderNos = Collections.synchronizedList(new ArrayList ()); IntStream.range(0,8000).parallel().forEach(i->{ orderNos.add(generateOrderNo()); }); List filterOrderNos = orderNos.stream().distinct().collect(Collectors.toList()); System.out.println(orderNos.size()); System.out.println(filterOrderNos.size()); }}
分布式环境下生成唯一订单号:
@GetMapping("/order")public String order() { // 获取键值,若没有键值则会新建,并初始化为 0 获取到值,并加1返回 Long orderNumber = redisTemplate.opsForValue().increment("order:number"); // 设置过期时间 redisTemplate.expire("order:number",10 ,TimeUnit.SECONDS); Object o = redisTemplate.opsForValue().get("order:number"); System.out.println("o.toString() = " + o.toString()); return o.toString();}
转载地址:http://jexxi.baihongyu.com/