精华内容
下载资源
问答
  • 高并发下唯一订单号生成思考? 订单号3个性质:1.唯一性 2.不可推测性 3.效率性可选方案一 本方案使用的是当前时间,包括毫秒数、纳秒数,不需要数据库参与计算,性能不用说。 public static String genId(String ...

    参考:常用的分布式ID方案

    快速查询设计

    带业务含义的编号,可以用来进行快速查询设计

    高并发下唯一订单号生成思考?

    订单号3个性质:1.唯一性  2.不可推测性 3.效率性

    可选方案一 
    本方案使用的是当前时间,包括毫秒数、纳秒数,不需要数据库参与计算,性能不用说。

    public static String genId(String machineId){
        String orderId =
                machineId +
                        (System.currentTimeMillis() + "").substring(1) +
                        (System.nanoTime() + "").substring(7, 10);
        System.out.println(orderId);
        return orderId;
    }

    讲解:
    参数machineId:是集群时的机器代码,可以1-9任意。部署时,分别为部署的项目手动修改该值,以确保集群的多台机器在系统时间上不一致的问题(毫无疑问每台机器的毫秒数基本上不一致)。
    参数System.currentTimeMillis():这是java里面的获取1970年到目前的毫秒数,是一个13位数的数字,与Date.getTime()函数的结果一样,比如1378049585093。经过研究,在2013年,前三位是137,在2023年是168,到2033年才199.所以,我决定第一位数字1可以去掉,不要占位置了。可以肯定绝大多数系统用不了10年20年。这样,参数2就变成了12位数的数字,加上参数1machineId才13位数。
    参数System.nanoTime():这是java里面的取纳秒数,经过深入研究,在同一毫秒内,位置7,8,9这三个数字是会变化的。所以决定截取这三个数字出来拼接成一个16位数的订单号。
    总结:理论上此方案在同一秒内,可以应对1000*1000个订单号,但是经过测试,在每秒并发2000的时候,还是会出现2-10个重复。

    可选方案二
    本方案基于UUID。
    UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,这个不重复性全世界人民都知道。当然,既然字符串值不重复,那对应的hashCode也是一样,不会重复。
    算法:

    Java代码  
    1. OrderId=  
    2. machineId+  
    3. UUID.randomUUID().toString().hashCode();  


    讲解:
    参数1不再解释。
    参数2是值生成UUID然后取它的hashCode值,经过测试,完全没有一点问题。您可以开1000w的并发去测试插入吧,只要数据库不会报唯一性错误,那就没问题。
    总结:
    hashCode这个算法从搞软件开始到现在这么多年,一直没派上用场,这次大大的用上了。解决了问题。请同志们以后善用这个东西。
    5、 附录:方案二的算法代码

    public static String getOrderIdByUUId(String machineId) {
    
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if (hashCodeV < 0) {//有可能是负数
            hashCodeV = -hashCodeV;
        }
        // 0 代表前面补充0
        // 4 代表长度为4
        // d 代表参数为正数型
        String orderId=machineId + String.format("%015d", hashCodeV);
        System.out.println(orderId);
        return orderId;
    }


    方案二其实也就一个函数,很简便。缺点:无序性。

    方案三、Snowflake

    64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))

    展开全文
  • <div><p>现在订单号是 20190127121835qd0tV 这样的 用付款订单号无法查询卡密</p><p>该提问来源于开源项目:Tai7sy/card-system</p></div>
  • 微信交易单号和订单号的区别

    万次阅读 2017-06-05 10:57:26
    一般第三方在线支付系统中都会有两类订单号 transactionId 为支付系统的订单号,由支付系统生成,并在回调时传回给商户,用于回调,也可查询订单状态 out_trade_no为商户平台的订单号,一般在商户平台生成,自己...

    一般第三方在线支付系统中都会有两类订单号

    transactionId 为支付系统的订单号,由支付系统生成,并在回调时传回给商户,用于回调,也可查询订单状态

    out_trade_no 为商户平台的订单号,一般在商户平台生成,自己可以设计自己的规则,如通过时分秒等生成随机数订单  一般不重复 

    商户提交后支付时把这个订单号传给第三方支付平台,在支付成功后,第三方把这个订单号传回来,我们通过这个订单号进行商户系统的其它操作。如更改数据库支付状态,增加减少商品等

     

    展开全文
  • zencart个性订单号

    2020-11-17 13:45:11
    zencart个性订单号修改 前缀想怎么改都OK 简单操作 还可以修改回来 这是我另一个渠道拿 的
  • 生成订单号

    2019-03-30 21:54:10
    今天给大家讲的是生成订单号,相信大家对订单号并不陌生,比如淘宝的快递单号和医院的订单号,它们是怎么生成的呢?我们来看一下。 首先用GETJSON写下跳到控制器的链接,然后获取订单号的ID名称。 页面代码: ...
    作者:孙英鹏。     撰写时间:2019-3-29 
    

    生成订单号

    今天给大家讲的是生成订单号,相信大家对订单号并不陌生,比如淘宝的快递单号和医院的订单号,它们是怎么生成的呢?我们来看一下。

    首先用GETJSON写下跳到控制器的链接,然后获取订单号的ID名称。

    页面代码:
    在这里插入图片描述

    跳到控制器这一边后,写下获取当前时间的代码,然后查询数据库里的订单号数据是否有重复,查完之后写一个判断,判断一下订单号的长度,订单号的组合是前面是这个订单号的名称 + 中间是时间 + 后面是数字。

    控制器代码:
    在这里插入图片描述

    代码思路:

    1. 获取当前时间作为订单号的中间数。
    2. 写三位数字,作为订单号的后面数,在用判断来判断订单号是否每用掉一个,后面的三位数字只能增,不能减。
    3. 写下这个订单号的名称缩写,作为订单号的前面数。
    4. 拼接订单号。
    展开全文
  • php中文网最新课程每日17点准时技术干货分享一、场景再现在一个erp进销存系统或0A...建立一张表和创建存储过程,存储过程负责生成订单号,表负责处理唯一性问题当存储过程生成一个订单编号,首先先把订单号写进表中...
    a0132cc1983ab0e122e8a1370771e7b9.png

    php中文网最新课程

    每日17点准时技术干货分享

    84c0960b6e7fe4d108b0b60c4fd2c2f1.png

    3597d569453db04313180ef8c873af77.gif

    一、场景再现

    在一个erp进销存系统或0A等其他系统中,如果多人同时进行生成订单号的操作的话,容易出现多人获得同一个订单号的情况,对公司业务造成不可挽回的损失

    二、如何避免高并发情况订单号不唯一

    我们可以利用存储过程和数据表搭配,建立一张表和创建存储过程,存储过程负责生成订单号,表负责处理唯一性问题

    77bad49674e23d1c335d32d6c7740713.png

    当存储过程生成一个订单编号,首先先把订单号写进表中,再把订单号结果显示出来,把生成的订单号写进表里会出现两种情况,为什么呢?因为我们的表设置了主键(主键唯一性)

    • 能写进: 当表里没有相同的订单号,即把生成的订单号写进表里

    • 不能写进:当表里存在相同的订单号,即生成的订单号无法写到表里,也就不能获取到订单号,从而确保高并发下生成唯一订单号

    三、高并发情况下生成唯一订单号的过程

    下面将用代码和实际操作讲解下生成唯一订单号的过程

    第一步:建一张数据表,设置订单号字段为主键(唯一订单号的关键)

    4c4ce7d66d13353be96342d702e6d552.png

    第二步:创建生成订编号的存储过程

    生成订单编号格式为:自定义前缀+年月日+后缀(001、002、003)1.首先创建一个存储过程
    输入为BILL_TYPE(前缀),输出为BILL_NOP(订单编号)

    CREATE DEFINER = CURRENT_USER PROCEDURE `getbillno`(in BILL_TYPE VARCHAR(3), out BILL_NOP varchar(25))BEGIN

    2.生成年月日和后缀
    年月日为当前系统时间,后缀初始值为0

    DECLARE currentDate varCHAR (15);DECLARE lastno INT DEFAULT 0;SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate;

    3.查询表格,获取表格的订单编号
    查询表格,获取前缀与自定义内容相关的最新一个订单编号

    SELECT IFNULL(BILL_NO, 'notnull') INTO BILL_NOP  FROM temp_bill   WHERE SUBSTRING(BILL_NO,1,3) =BILL_TYPE and  SUBSTRING(BILL_NO,4,8) =currentDate  ORDER BY BILL_NO DESC LIMIT 1;

    4.生成订单编号

    • 如果上一步获取的订单编号不为空,新生成的订单号在原订单号上+1

      例:获取的订单号:UIE20200611015
      即生成的订单号为:UIE20200611016

    • 如果上一步获取的订单号为空,新生成的订单号后缀为001
      例:生成的订单号:UIE20200611001

    IF BILL_NOP !='' THEN SET lastno = CONVERT(SUBSTRING(BILL_NOP, -3), DECIMAL) ;  SELECT   CONCAT(BILL_TYPE,currentDate,LPAD((lastno + 1),3, '0')) INTO BILL_NOP ;ELSE SELECT   CONCAT(BILL_TYPE,currentDate,LPAD((lastno + 1),3, '0')) INTO BILL_NOP ;END IF;

    5.将生成的订单号插入表中
    如果表中存在相同订单号则插入表失败
    如果表中不存在相同订单号则插入表成功

    INSERT INTO temp_bill (BILL_NO, BILL_TYPE) VALUES (BILL_NOP,BILL_TYPE) ;

    6.返回唯一订单编号
    当订单插入表成功,即可返回唯一的订单编号(如果上一步不成功,即不会运行这一步)

    SELECT   BILL_NOP;

    四、运行结果

    1.首先我的表里没有数据,会生成前缀(我输入的:UIE)+年月日(
    20200611)+001(第一个数据,所以是001)
    即:UIE20200611001

    2当我第二次输入时,由于表里有数据了,会根据最新的订单编号后缀加1
    即:UIE20200611002

    8df9c9a7d4536dcd8cdc14717e188704.gif

    五、不是小结的小结

    希望这边文章可以帮到大家
    积分充足的就直接下载吧,没有积分的对着图敲,反正代码量也不大
    如果你是学生,没有积分,可以私聊我,免费给你发源码

    代码下载链接:mysql_getbillno.sql
    代码截图:

    59d2e6c5232344fe8dc04521813bd9c8.png

    660f53f3361a30605869c241ed97ed56.png

    53534b433a73529b971b4677f239257f.png

    展开全文
  • 订单号提交

    2020-03-21 00:44:00
    在电商业务中,商品的交付都是围绕订单号来进行的。交易的基础流程包括创建订单、支付订单、交付订单、签收订单。 基于订单,我们可以做很多事情。比如,建立一条交易的数据总线...
  • 仔细考虑下上述方法,在顾客购买量少的情况下,订单重复的可能性为零,但是在购买高蜂期生成的订单号重复是很有可能发生的。二、自定义生成订单号中使用的PHP内置的函数说明如下函数说明:openssl_ra...
  • 不重复订单号生成的方法

    万次阅读 2017-03-09 17:46:06
    第一种 GUID 由算法自动生成下 理论上能产生全球唯一的值 不过对于用户记订单号不方便 Console.WriteLine(System.Guid.NewGuid()); Console.ReadKey();  //生成结果:5322d297-51b4-419...
  • 1、分布式集群架构2、分布式高并发环境的订单号要求全局唯一订单号信息要安全趋势递增3、订单号生成策略总结策略优点缺点格式uuid实现简单不占用带宽无序、不可读、查询慢32位db自增无代码、递归DB单点故障、扩展有...
  • 这里介绍的是订单号或者流水号的生成,用的方法是时间戳+随机数,如果你要严谨的算法生成的订单号,请勿下载,下载前,可以看下这篇文章介绍【https://blog.csdn.net/qq_27471405/article/details/82887786】
  • 订单号特性 唯一性:每个订单号全局唯一代表一个订单; 安全性:订单号不能透露订单量、运营规模等业务信息(数据安全性); 高性能:订单号的创建成本越低越好; 扩展性:能够较好的支撑后续业务发展变大带来的分...
  • PHP生成唯一订单号

    2020-10-23 23:17:33
    主要给大家介绍了一位网友PHP生成唯一订单号的思路和示例,感觉非常不错,需要的朋友可以参考下
  • * 得到新订单号 * @return string */ function get_order_sn() { /* 选择一个随机的方案 */ mt_srand((double)microtime() * 1000000); return date('Ymdhi') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_...
  • * 生成不会重复的订单号 * @param mixed|null $prefix * 为null的时候没有前缀, * 为空字符串的时候,按年计算前缀,34年不会重复 * @param bool $bigOrder * 为false的时候表示订单量较小 * 为true的时候...
  • 今天看了黎活明老师的 实现订单加锁解锁(也包括生成订单号)功能 的视频,即多人操作(审核等)订单时的如何加锁。对事务并发又温习了一下。涉及的东西无非是操作系统的多线程引起的并发,这里有个概念就是cpu时间片,...
  • 相信做过订单系统的小伙伴们都有这样的需求,怎么样实现生成的订单支付号 和订单号之间看上去有点关系,实际上也有点关联呢?下面介绍的这个方法就是 通过订单号 ,生成支付号 的好方法:之间贴代码吧,看了就懂的:...
  • 订单号生成工具类

    2018-03-29 16:56:54
    订单号生成工具类,拿来即用,方便快捷无重复。 订单号生成工具类,拿来即用,方便快捷无重复。
  • JAVA生成订单号(日期+流水号) java按日期加流水号方式生成订单号,已经测试过,可递增方式生成。
  • 1.用UUID生成十六位数唯一订单号public static String getOrderIdByUUId() {int machineId = 1;//最大支持1-9个集群机器部署int hashCodeV = UUID.randomUUID().toString().hashCode();if(hashCodeV < 0) {//有...
  • 订单号生成

    2017-06-24 11:38:51
    高并发下怎么生成唯一订单号 方案一:  如果没有并发的话,订单号只在一个线程中产生,不同订单的时间戳不同,  时间戳+随机数(自增数)区分订单 如果有并发的话,并且订单号在同一台主机产生多个进程,...
  • 因为最近做项目需要,需要使用到,自定义的不重复的自增长的订单号,在网上找了资料然后又加入了自己的修改,做成的mysql生成订单号的存储过程。drop PROCEDURE pp;create procedure PROC_GET_NO (tname varchar(50)...
  • php生成不重复订单号的方法:首先可以预先生成订单号;然后进行去重存起来;最后用的时候取一个出来用就行,代码为【$orderNo = date('YmdHis').substr(microtime(), 2, 5)】。相关学习推荐:php编程(视频)php生成不...
  • 在开发项目的时候经常有生成订单号的需求,这里列出两种生成20位订单号的常用方法。方法一:以下代码是14位当前时间加6位随机数,如果增减位数,只需修改末尾的数字6即可。...
  • 订单号3个性质:1.唯一性2.不可推测性3.效率性可选方案一本方案使用的是当前时间,包括毫秒数、纳秒数,不需要数据库参与计算,性能不用说。publicstaticStringgenId(StringmachineId){StringorderId=machineId+...
  • 订单号自动生成

    2014-08-14 17:08:31
    能够自动生成订单号,包括时间戳和特殊字符等!
  • 主要为大家详细介绍了C#如何生成唯一订单号,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • PHP 生成订单号

    2021-01-06 18:34:21
    记录一下 生成订单号的一个方法, /** * 生成订单号 */ protected function orderNo() { return date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); } ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,934
精华内容 4,373
关键字:

订单号