精华内容
下载资源
问答
  • 订单号生成

    2017-06-24 11:38:51
    高并发下怎么生成唯一订单号 方案一:  如果没有并发的话,订单号只在一个线程中产生,不同订单的时间戳不同,  时间戳+随机数(自增数)区分订单 如果有并发的话,并且订单号在同一台主机产生多个进程,...
    高并发下怎么生成唯一订单号
    方案一:
      如果没有并发的话,订单号只在一个线程中产生,不同订单的时间戳不同,
      时间戳+随机数(自增数)区分订单
    如果有并发的话,并且订单号在同一台主机产生多个进程,只要把进程的ID添加到序列号中就可以保证订单号唯一。
    如果有并发,订单在不同主机中,把IP地址 CPU序列号 能区分的号码添加到序列号中就能保证唯一。

    方案二:
    时间戳+用户ID+随机数+乐观锁

    方案三:
      可以用redis的原子递增,做高可用集群
    redis本身就有生成序列号的功能,使用执久化的线程安全的

    方案四:
       java自带的UUID

    XX的订单号:XXCN201700000000
    YY的订单号: YYCN201700000000
    年份要根据真实年份进行相应变化,然后一旦年份更新,后面8位要从00000000重新开始。

    其实可以通过redis来做,不过这个需求也是奇葩,是怕人家不知道系统有多少订单?
    如果是postgrel,可以用序列。
    可以用redis的原子递增,做高可用集群

    http://m.blog.csdn.net/shuaizai88/article/details/53566425
    展开全文
  • 订单号生成工具类

    2018-03-29 16:56:54
    订单号生成工具类,拿来即用,方便快捷无重复。 订单号生成工具类,拿来即用,方便快捷无重复。
  • 高并发下唯一订单号生成思考? 订单号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(重复累加))

    展开全文
  • Python模拟订单号生成

    千次阅读 2020-03-26 13:57:23
    模拟订单号生成 为了产生不冲突的订单号,本次测试订单生成逻辑比较简单:当天时间拼接自增数列 from datetime import datetime def set_flow(): base_code = datetime.now().strftime('%Y%m%d%H%M%S') oreder_...

    模拟订单号生成

    为了产生不冲突的订单号,本次测试订单生成逻辑比较简单:当天时间拼接自增数列

    from datetime import datetime
    def set_flow():
        base_code = datetime.now().strftime('%Y%m%d%H%M%S')
        oreder_list = []
        count = 1
        while True:
            if count > 100:
                break
            count_str = str(count).zfill(8)
            oreder_list.append(base_code + count_str)
            count += 1
        return oreder_list
    

    结果如下:

    >>> a=set_flow()
    >>> a
    ['2020032613551000000001', '2020032613551000000002', '2020032613551000000003', '2020032613551000000004', '2020032613551000000005', '2020032613551000000006', '2020032613551000000007', '2020032613551000000008', '2020032613551000000009', '2020032613551000000010', '2020032613551000000011', '2020032613551000000012', '2020032613551000000013', '2020032613551000000014', '2020032613551000000015', '2020032613551000000016', '2020032613551000000017', '2020032613551000000018', '2020032613551000000019', '2020032613551000000020', '2020032613551000000021', '2020032613551000000022', '2020032613551000000023', '2020032613551000000024', '2020032613551000000025', '2020032613551000000026', '2020032613551000000027', '2020032613551000000028', '2020032613551000000029', '2020032613551000000030', '2020032613551000000031', '2020032613551000000032', '2020032613551000000033', '2020032613551000000034', '2020032613551000000035', '2020032613551000000036', '2020032613551000000037', '2020032613551000000038', '2020032613551000000039', '2020032613551000000040', '2020032613551000000041', '2020032613551000000042', '2020032613551000000043', '2020032613551000000044', '2020032613551000000045', '2020032613551000000046', '2020032613551000000047', '2020032613551000000048', '2020032613551000000049', '2020032613551000000050', '2020032613551000000051', '2020032613551000000052', '2020032613551000000053', '2020032613551000000054', '2020032613551000000055', '2020032613551000000056', '2020032613551000000057', '2020032613551000000058', '2020032613551000000059', '2020032613551000000060', '2020032613551000000061', '2020032613551000000062', '2020032613551000000063', '2020032613551000000064', '2020032613551000000065', '2020032613551000000066', '2020032613551000000067', '2020032613551000000068', '2020032613551000000069', '2020032613551000000070', '2020032613551000000071', '2020032613551000000072', '2020032613551000000073', '2020032613551000000074', '2020032613551000000075', '2020032613551000000076', '2020032613551000000077', '2020032613551000000078', '2020032613551000000079', '2020032613551000000080', '2020032613551000000081', '2020032613551000000082', '2020032613551000000083', '2020032613551000000084', '2020032613551000000085', '2020032613551000000086', '2020032613551000000087', '2020032613551000000088', '2020032613551000000089', '2020032613551000000090', '2020032613551000000091', '2020032613551000000092', '2020032613551000000093', '2020032613551000000094', '2020032613551000000095', '2020032613551000000096', '2020032613551000000097', '2020032613551000000098', '2020032613551000000099', '2020032613551000000100']
    

    其中zfill函数是为了在字符前补零,比如你想把某个字符a=‘1’设置成4位,那么你就可以使用a.zfill(4),那么结果就会是’0001’。

    >>> a='1'
    >>> b=a.zfill(4)
    >>> b
    '0001'
    >>> w='-1'
    >>> c=w.zfill(4)
    >>> c
    '-001'
    
    展开全文
  • 订单号生成函数

    2017-09-07 15:46:00
    以下是我在做电商系统用的订单号生成函数 ::/** * 订单序列生成 16位 * $type支付/提取类型 * $usertype用户类型 * $oid 订单自增长 */public function getOrderNo($type,$usertype,$oid){ $password = array(0 =&...
    以下是我在做电商系统用的订单号生成函数 ::
    /**
    * 订单序列生成 16位
    * $type支付/提取类型
    * $usertype用户类型
    * $oid 订单自增长
    */
    public function getOrderNo($type,$usertype,$oid)
    {
    $password = array(0 => array(0, 5, 1, 2, 6, 4, 3, 8, 9, 7),
    1 => array(9, 8, 7, 6, 5, 4, 3, 2, 1, 0),
    2 => array(4, 3, 2, 1, 0, 5, 6, 7, 8, 9),
    3 => array(5, 6, 7, 8, 9, 0, 1, 2, 3, 4),
    4 => array(9, 0, 8, 1, 7, 3, 6, 4, 5, 2),
    5 => array(7, 2, 6, 4, 5, 1, 8, 0, 9, 3),
    6 => array(6, 7, 8, 9, 5, 4, 3, 2, 1, 0),
    7 => array(5, 9, 7, 8, 3, 4, 2, 6, 1, 0),
    );
    $ret = date('ymd') . $type . $usertype;
    $oid = str_pad($oid, 8, "0", STR_PAD_LEFT);
    for ($i = 0; $i < 8; $i++) {
    $oid[$i] = $password[$i][$oid[$i]];
    }
    $ret .= $oid;
    return $ret;

    }

    转载于:https://www.cnblogs.com/qichao123/p/7490129.html

    展开全文
  • 高并发订单号生成工具类,TWITTER编码方式可BAIDU
  • 不重复订单号生成的方法

    万次阅读 2017-03-09 17:46:06
    第一种 GUID 由算法自动生成下 理论上能产生全球唯一的值 不过对于用户记订单号不方便 Console.WriteLine(System.Guid.NewGuid()); Console.ReadKey();  //生成结果:5322d297-51b4-419...
  • 今天讨论分享下订单号生成的简单实现方案,为实际场景中需要用到订单号生成服务提供解决思路。最简单的方式基于数据库auto_increment_increment来获取 ...
  • 大流量下订单号生成方法

    千次阅读 2018-03-08 12:30:02
    流量不大的情况下,订单号生成 很久之前写过一篇利用DB生成业务主键的文章,介绍了利用DB来生成唯一的ID。当时便是用这种方式来生成订单号的。只不过拿到ID后,根据订单业务,简单加个前缀而已。 @Service ...
  • 最近老是被运营抱怨订单号太长不方便输入,可是如果随机生成太短的订单号又容易重复,造成客户提交订单失败。 夜不能眠下写了这个工具,完美解决... * 订单号生成器 */ public class OrderNoGenerator { priv...
  • 订单号生成的一些想法 背景  早上QA小姐姐发现线上有个报错,过去一看,采购单号生成异常,后台duplicate key,也就是说生成了重复单号。这个模块之前不是我写的(这个哥们刚离职了),而后来的领...
  • 主要介绍了java web在高并发和分布式下实现订单号生成唯一的解决方案,需要的朋友可以参考下
  • 例子,php生成订单号的类。复制代码 代码示例:/*** PHP版本的自动生成有规则的订单号(或编号)* 作者: 雪浪* 日期: 2009-8-14* 生成的格式是: 200908010001 前面几位为当前的日期,后面五位为系统自增长类型的编号* ...
  • Java实现的订单号生成工具,生成非重复订单号,可设置每毫秒生成的订单最大值。用到了对象锁。import java.text.SimpleDateFormat;import java.util.Date;/*** @ClassName: MakeOrderNum* @CreateTime 2015年9月13日...
  • 十五位订单号生成(日期+随机数)

    万次阅读 2018-04-10 20:32:20
    项目中遇到了订单号生成,看了一下网上的方案,最后选择了15位的订单号订单号生成是遵循一些规则的,不同的业务需要不同长度的订单号.大家可以查看淘宝京东等大型电子商务网站的订单号长度,依稀可以看出它们的订单号的...
  • 订单号生成策略

    千次阅读 2017-12-05 10:45:42
    本文与大家分享一下各大电子商务网站订单号生成方式。 1 订单号是什么? 它是您在购物网站购物后获得的订单号,记录的是购物订单信息;在您需要与购物网站进行订单查询等操作时,需要给购物网站提供...
  • 关于订单号生成的几张方案探讨

    千次阅读 2017-02-21 13:38:44
    订单系统中的订单号生成规则
  • //取系统当前时间作为订单号前半部分 builder.append(Math.abs(lock.hashCode()));//HASH-CODE builder.append(atomicInteger.getAndIncrement());//自增顺序 threadLocal.set(builder);returnthreadLocal.get()....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,134
精华内容 1,253
关键字:

订单号生成