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

    2021-03-14 23:04:20
    生成订单号 /** * 生成11位订单号,日期占6位 + 5位0~100000之间的不重复随机数,例如:21031403607 * */ public class RandomNumbers { private static final Jedis jedis; static { System.out.println(1); ...

    生成订单号

    /**
     * 生成11位订单号,日期占6位 + 5位0~100000之间的不重复随机数,例如:21031403607
     *
     */
    public class RandomNumbers {
    
        private static final Jedis jedis;
    
        static {
            System.out.println(1);
            //连接redis
            JedisPool jedisPool = new JedisPool("127.0.0.1", 6379, null, "root");
            jedis = jedisPool.getResource();
            //当天不更新,方便调试时不会出现重复订单号
            String today = new SimpleDateFormat("yyyyMMdd").format(new Date());
            if (!today.equals(jedis.get("randomNumbers:today"))) {
                //存入今天日期
                jedis.set("randomNumbers:today", today);
                jedis.persist("randomNumbers:today");
                //初始化计数器
                jedis.set("randomNumbers:counter", "-1");
                jedis.persist("counter");
    
                List<String> numberList = new ArrayList<>();
                for (int i = 0; i < 100000; i++) {
                    numberList.add(String.valueOf(i));
                }
                //乱序
                Collections.shuffle(numberList);
    
                for (int i = 0; i < 100; i++) {
                    List<String> list = numberList.subList(i * 1000, (i + 1) * 1000);
                    //清空已存在的列表
                    jedis.del("randomNumbers:" + i);
                    jedis.rpush("randomNumbers:" + i, list.toArray(new String[0]));
                    //永不过期
                    jedis.persist("randomNumbers:" + i);
                }
            }
    
    
        }
    
        public static String createOrder() {
            //获取索引
            long index = jedis.incr("randomNumbers:counter") % 100000;
            //查询字段
            StringBuilder number = new StringBuilder(jedis.lindex("randomNumbers:" + index / 1000, index % 1000));
            int MissingLenth = 5 - number.length();
            for (int i = 0; i < MissingLenth; i++) {
                number.insert(0, "0");
            }
            return new SimpleDateFormat("yyyyMMdd").format(new Date()).substring(2) + number;
        }
    
        //测试bug
        @Test
        public void testBug() {
            List<String> list = new ArrayList<>();
            for (int i = 0; i < 100000; i++) {
                String order = createOrder();
                if (order.length() != 11) {
                    System.out.println(order);
                    throw new RuntimeException("订单号长度有bug");
                }
                if (list.contains(order)) {
                    System.out.println(order);
                    throw new RuntimeException("订单号重复出现!");
                } else {
                    list.add(order);
                }
            }
        }
    
        //测试性能
        @Test
        public void testSpeed() {
            long startTime = System.currentTimeMillis();
            for (int i = 0; i < 100000; i++) {
                createOrder();
            }
            long endTime = System.currentTimeMillis();
            System.out.println("平均每个订单号生成耗时" + (endTime - startTime) / 100000.0 + "ms");
        }
    }
    
    展开全文
  • 生成订单号码

    2012-11-24 22:27:48
    我设想先先从数据库里提取出当天最大的订单编号(如20121124005),在C#里面用代码将该编号进行加1操作,然后再把加1后的订单编号写入数据库。因为是要做订票网站,为了实现订单编号不重复,我打算用锁或事物来处理。...
  • 收藏php生成订单号函数,方便日后使用。订单号生成很多种方式和方法,有按标志性规则的,有按业务划分的,有按订统一单生成器的,等等等等。但在众多方式中,离不开:安全性,唯一性。生成个:简短,支持高并发,...

    收藏php生成订单号函数,方便日后使用。订单号生成很多种方式和方法,有按标志性规则的,有按业务划分的,有按订统一单生成器的,等等等等。但在众多方式中,离不开:安全性,唯一性。生成个:简短,支持高并发,安全唯一的,又包含业务规则的订单号,实在不容易。

    一、摘录自:ShopNC 生成订单编号/**

    * ShopNC 生成订单编号

    * @return string

    */

    function snOrder() {

    $recharge_sn = date('Ymd').substr( implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))) , -8 , 8);

    return $recharge_sn;

    }

    样例:

    string '2018011149985556' (length=16)

    string '2018011197489748' (length=16)

    解释://获取一个带前缀、基于当前时间微秒数的唯一ID。

    var_dump(uniqid());

    //string '5a5777a2f2eb8' (length=13)

    //获取变化频繁的后6位

    var_dump(substr(uniqid(),7,13));

    //string '2f2eb8' (length=6)

    //将字符串转换为数组,每段长度为1

    var_dump(str_split(substr(uniqid(),7,13),1));

    /*array (size=6)

    0 => string '2' (length=1)

    1 => string 'f' (length=1)

    2 => string '2' (length=1)

    3 => string 'e' (length=1)

    4 => string 'b' (length=1)

    5 => string '8' (length=1)*/

    //使用array_map对数组每个值,都掉用ord()函数,返回相应字符的ASCII码值

    var_dump(array_map('ord',str_split(substr(uniqid(),7,13),1)));

    /*array (size=6)

    0 => int 50

    1 => int 102

    2 => int 51

    3 => int 50

    4 => int 97

    5 => int 48*/

    //传入null将数组数字在拼接成为一个数字字符串

    var_dump(implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))));

    //string '5010251509748' (length=13)

    //由于长度很难统一,从倒数第八位开始截取8位数

    var_dump(substr(implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))),-8,8));

    //string '51509748' (length=8)

    二、摘录自:ECSHOP 得到新订单号/**

    * ECSHOP 得到新订单号

    * @return  string

    */

    function get_order_sn() {

    //选择一个随机的方案

    mt_srand((double) microtime() * 1000000);

    return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);

    }

    样例:

    string '2018011181845' (length=13)

    string '2018011120993' (length=13)

    解释://mt_srand() 播种 Mersenne Twister 随机数生成器

    //自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现已自动完成

    mt_srand((double) microtime() * 1000000);

    //生成1-99999的随机数

    var_dump(mt_rand(1, 99999));

    //string '5097' (length=4)

    //不足5位的随机数,就在前面补0。STR_PAD_LEFT在左端填充

    var_dump(str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT));

    //string '05097' (length=5)

    如果日后开发过程中发现新的,再摘录接着补充进去。

    原创文章,转载请注明出处:https://www.weizhixi.com/article/57.html

    展开全文
  • JAVA生成订单号(日期+流水号) java按日期加流水号方式生成订单号,已经测试过,可递增方式生成。
  • 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); } ...

    记录一下 生成订单号的一个方法,

    /**
         * 生成订单号
         */
        protected function orderNo()
        {
            return date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
        }
    

    闲言碎语:一开始的订单号是:date(‘md’).time(),日期加上时间戳,还以为自己多厉害 ,经大佬一提醒,这么写生成的订单号会重复!因为时间戳只会精确到秒。之后:查询资料加以改正。即上述生成订单的方法。

    展开全文
  • Java 生成订单号

    千次阅读 2016-12-08 10:12:58
    Java 生成订单号 生成订单号是很常用的一个功能,要求生成唯一不重复的值,作为订单唯一标识。这个主要是使用时间,生成年月日加自增数,每毫秒最多可以生成9999个订单号

    现在开始好好写自己的代码。

    生成订单号是很常用的一个功能,要求生成唯一不重复的值,作为订单唯一标识。方法有很多,有写是直接根据数据库自增ID作为订单号,也有使用GUID作为订单号的等等。。。
    其实各有优点,具体根据自己的业务需求来定义了。而我这个主要是使用时间,生成年月日加自增数,每毫秒最多可以生成9999个订单,当然这个是可以配置的,根据现实业务情况进行定义。下面来看代码:

    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * 生成订单号类
     */
    public class GenerateNum {
        // 使用单例模式,不允许直接创建实例
        private GenerateNum() {}
    
        // 创建一个空实例对象,类需要用的时候才赋值
        private static GenerateNum g = null;
    
        // 单例模式--懒汉模式
        public static synchronized GenerateNum getInstance() {
            if (g == null) {
                g = new GenerateNum();
            }
            return g;
        }
    
        // 全局自增数
        private static int count = 0;
    
        // 每毫秒秒最多生成多少订单(最好是像9999这种准备进位的值)
        private static final int total = 9999;
    
        // 格式化的时间字符串
        private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    
        // 获取当前时间年月日时分秒毫秒字符串
        private static String getNowDateStr() {
            return sdf.format(new Date());
        }
    
        // 记录上一次的时间,用来判断是否需要递增全局数
        private static String now = null;
    
        /*
         * 生成一个订单号
         */
        public synchronized String GenerateOrder() {
            String datastr = getNowDateStr();
            if (datastr.equals(now)) {
                count++;// 自增
            } else {
                count = 1;
                now = datastr;
            }
            int countInteger = String.valueOf(total).length() - String.valueOf(count).length();// 算补位
            String bu = "";// 补字符串
            for (int i = 0; i < countInteger; i++) {
                bu += "0";
            }
            bu += String.valueOf(count);
            if (count >= total) {
                count = 0;
            }
            return datastr + bu;
        }
    }

    这里用了单例懒汉模式。调用的时候:

    GenerateNum.getInstance().GenerateOrder();

    测试输出如下:

    201612081010145410001
    201612081010145410002
    201612081010145410003
    201612081010145410004
    201612081010145410005
    201612081010145410006
    201612081010145410007
    201612081010145410008
    201612081010145420001
    201612081010145420002
    201612081010145420003
    201612081010145420004
    201612081010145420005
    201612081010145420006
    201612081010145420007
    201612081010145420008
    201612081010145420009
    201612081010145420010
    201612081010145420011
    201612081010145420012
    201612081010145420013
    201612081010145420014
    201612081010145420015
    201612081010145420016
    201612081010145420017
    201612081010145420018
    201612081010145420019
    201612081010145420020
    201612081010145420021
    201612081010145420022
    201612081010145420023
    201612081010145420024
    201612081010145420025
    201612081010145420026
    201612081010145420027
    201612081010145420028
    201612081010145420029
    201612081010145420030
    201612081010145420031
    201612081010145420032
    201612081010145420033
    201612081010145420034
    201612081010145420035
    201612081010145420036
    201612081010145420037
    201612081010145420038
    201612081010145420039
    201612081010145420040
    201612081010145420041
    201612081010145420042
    201612081010145420043
    201612081010145420044
    201612081010145420045
    201612081010145440001
    201612081010145440002
    201612081010145440003
    201612081010145440004
    201612081010145450001
    201612081010145450002
    201612081010145450003
    201612081010145450004
    201612081010145450005
    201612081010145450006
    201612081010145450007
    201612081010145450008
    201612081010145450009
    201612081010145450010
    201612081010145450011
    201612081010145450012
    201612081010145450013
    201612081010145450014
    201612081010145450015
    201612081010145450016
    201612081010145450017
    201612081010145450018
    201612081010145450019
    201612081010145450020
    201612081010145450021
    201612081010145450022
    201612081010145450023
    201612081010145450024
    201612081010145450025
    201612081010145450026
    201612081010145450027
    201612081010145450028
    201612081010145450029
    201612081010145450030
    201612081010145450031
    201612081010145450032
    201612081010145450033
    201612081010145450034
    201612081010145450035
    201612081010145450036
    201612081010145450037
    201612081010145450038
    201612081010145450039
    201612081010145450040
    201612081010145450041
    201612081010145450042
    201612081010145450043
    201612081010145450044
    201612081010145450045
    201612081010145450046
    201612081010145450047
    201612081010145450048
    展开全文
  • PHP生成订单号

    2020-08-29 11:53:22
    //生成订单号 [0.015秒内绝不重复][14位][纯数字] function build_order_no(){ //19051697489855 return date("ymd").substr(implode(NULL, array_map('ord',str_split(substr(uniqid(),7,13),1))),0,8); } //...
  • 例子,php生成订单号的类。复制代码 代码示例:/*** PHP版本的自动生成有规则的订单号(或编号)* 作者: 雪浪* 日期: 2009-8-14* 生成的格式是: 200908010001 前面几位为当前的日期,后面五位为系统自增长类型的编号* ...
  • 利用redis生成订单号

    2020-12-31 15:27:00
    利用redis生成订单号 订单号一般都是生成18位数的,订单号由8为日期、2位平台号、2为支付方式和6为以上的自增id组成。这里的redis主要担任6为自增id的生成。 源码:...
  • python生成订单号或生成任意序列 示例代码: import time # 生成订单号 def get_order_code(): # 年月日时分秒+time.time()的后7位 order_no = str(time.strftime('%Y%m%d%H%M%S', time.localtime(time.time...
  • C#生成订单号

    2019-08-27 12:29:25
    /// <summary> /// 生成订单号 /// </summary> /// <param name="topId">类目ID,商品编号</param> /// <param name="tableNum">表名尾数</param> ...

空空如也

空空如也

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

生成订单号