当前位置:首页 > Java技术 > javaEE高并发之如何产生唯一不重复订单号

javaEE高并发之如何产生唯一不重复订单号

2022年09月17日 08:02:39Java技术6

javaEE高并发之如何产生唯一不重复订单号

1.方案一:使用进程ID,线程ID,IP,MAC地址和时间戳进行拼接产生订单号

(1)如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间戳正常不同,因此用时间戳+随机数(或自增数)就可以区分各个订单。

(2)如果存在并发,且订单号是由一个进程中的多个线程产生的,那么只要把线程ID添加到序列号中就可以保证订单号唯一。

//java获取线程ID
Thread.currentThread().getId()

(3)如果存在并发,且订单号是由同一台主机中的多个进程产生的,那么只要把进程ID添加到序列号中就可以保证订单号唯一。

//java获取进程ID

RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();

Field jvm = runtime.getClass().getDeclaredField("jvm");

jvm.setAccessible(true);

VMManagement mgmt = (VMManagement) jvm.get(runtime);

Method pidMethod = mgmt.getClass().getDeclaredMethod("getProcessId");

pidMethod.setAccessible(true);

int pid = (Integer) pidMethod.invoke(mgmt);

(4)如果存在并发,且订单号是由不同台主机产生的,那么MAC地址、IP地址或CPU序列号等能够区分主机的号码添加到序列号中就可以保证订单号唯一。     

//java获取mac地址

InetAddress ia = InetAddress.getLocalHost();

byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();

String macStr = DatatypeConverter.printHexBinary(mac)

方案二:

时间戳+用户ID+几个随机数+乐观锁。

 

方案三:

        用redis的原子递增,做好高可用集群。

https://blog.csdn.net/rj151YY/article/details/84534545

 

方案四:

        使用java自带uuid(通用统一标示码)生成订单号。

/*
*
* UUID的标准型式包含32个16进位数字,以连字号分为五段,形式为8-4-4-4-1232个字符,
* 加上“-”一共是36位,所以咱们可以先取出uuid,再把“-”去掉。
*/
String Str1=UUID.randomUUID().toString().replace("-", "");

 

作者:zyy_sunshine
来源链接:https://blog.csdn.net/rj151YY/article/details/84535068

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42389.html

分享给朋友:

“javaEE高并发之如何产生唯一不重复订单号” 的相关文章

Java多线程高并发学习笔记——阻塞队列

Java多线程高并发学习笔记——阻塞队列

在探讨可重入锁之后,接下来学习阻塞队列,这篇文章也是断断续续的写了很久,因为最近开始学ssm框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享。 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/superfj/p/7757...

java ftp上传文件 支持并发

package com.dl.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOE...

如何在高并发环境下设计出无锁的数据库操作(Java版本)

  一个在线2k的游戏,每秒钟并发都吓死人。传统的hibernate直接插库基本上是不可行的。我就一步步推导出一个无锁的数据库操作。   1. 并发中如何无锁。 一个很简单的思路,把并发转化成为单线程。Java的Disruptor就是一个很好...

Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)

Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)

不得不看的JMM介绍,JMM不同于java运行时内存区域划分,本文从区域划分拓展到JMM,多线程必备的知识点,并且从原子性可见性有序性三个角度深入的分析了JMM的在这几个点涉及的部分 JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的...

《实战Java高并发程序设计》读书笔记一

《实战Java高并发程序设计》读书笔记一

第一章 走入并行世界 1、基本概念 同步:同步方法一旦开始,调用者必须等到方法调用返回后,才能继续后续操作 异步:一旦开始,方法调用就会立即返回,调用就可以继续后续操作 并发:表示两个或者多个任务一起执行,偏重于任务交替执行,而多个任务之间...

5W字高质量java并发系列详解教程(上)-附PDF下载

5W字高质量java并发系列详解教程(上)-附PDF下载

文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledEx...

Java高并发秒杀API之web层

Java高并发秒杀API之web层

---1-1 前端交互设计-------------------------------------------------------------- WEB相关课程:1. 前端交互设计2. Restful3. SpringMVC4. bootstrap + jquery...

Java解决高并发下商品库存更新

Java解决高并发下商品库存更新

˃˃ _ JavaClub全栈架构师技术笔记"˃2019独角兽企业重金招聘Python工程师标准>>> 一、问题分析 先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个...

Java高并发秒杀API之web层1

4.交换逻辑编程 ----4.1 cookies登陆交互------------------------------------------------- 注意:js的文件夹不能放在WEB-INF下,否则访问不到 参照:jsp文件引入js文件的方式(项目部署于web容...

Java高并发--线程

Java高并发--线程

1. 线程 1.1 进程和线程 ​ 进程:是系统进行资源分配和调度的基本单位,进程是程序的基本执行实体;进程是程序的容器 ​ 线程:线程是轻量级的进程,是程序执行的最小单位。并发程序设计使用多线程是因为线程间的切换和调度的成本远低于进程...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。