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

    2020-01-14 14:01:46
    订单编号生成器 setOrderId(System.currentTimeMillis() + String.valueOf(random.nextInt(900000) + 100000)+dateTime.toString(“yyyymmdd”)+String.valueOf(random.nextInt(90000) + 10000));//好东西,订单编号...

    订单编号生成器

    setOrderId(System.currentTimeMillis() + String.valueOf(random.nextInt(900000) + 100000)+dateTime.toString(“yyyymmdd”)+String.valueOf(random.nextInt(90000) + 10000));//好东西,订单编号生成器。

    展开全文
  • 订单编号生成

    千次阅读 2016-03-17 09:21:54
    package ... import java.text.SimpleDateFormat; import java.util.Date; ... * 订单编号生成类 */ public class GenerateOrderNoUtil { private static long orderNum = 0l; private
    <span style="font-size:18px;">package com.guiyang.common.core.util;
    
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    
    /**
     * 订单编号生成类
     */
    public class GenerateOrderNoUtil {
    
    
    	private static long orderNum = 0l;
    	private static String date;
    
    	/**
    	 * 生成订单编号
    	 * @return
    	 */
    	public static synchronized String getOrderNo() {
    		String str = new SimpleDateFormat("yyMMddHHmm").format(new Date());
    		if (date == null || !date.equals(str)) {
    			date = str;
    			orderNum = 0l;
    		}
    		orderNum++;
    		long orderNo = Long.parseLong((date)) * 10000;
    		orderNo += orderNum;
    		return orderNo + "";
    	}
    }</span>
    在项目中,这种方式效率太慢,于是自己写了个,地址:http://blog.csdn.net/u012012240/article/details/51249992
    展开全文
  • 简单的订单编号生成思路,即由时间(YYYYMMDD)+时间戳的格式生成。 //自定义订单编号生成规则 由YYYYMMDD(年月日) + 时间戳的格式组成 let currDate = new Date(); let year = currDate.getFullYear(); let ...

    简单的订单编号生成思路,即由时间(YYYYMMDD)+时间戳的格式生成。

    		   //自定义订单编号生成规则   由YYYYMMDD(年月日) + 时间戳的格式组成
                let currDate = new Date();
                let year = currDate.getFullYear();
                let month = currDate.getMonth() + 1 < 10 ? "0" + (currDate.getMonth() + 1): currDate.getMonth() + 1;
                let day = currDate.getDate()<10 ? "0"+currDate.getDate() : currDate.getDate();
                
                //获取年月日
                let date = year + month + day; //20190524
                
                //获取当时时间戳
                let timestamp = Date.parse(currDate); //155866554500
                
                //生成订单
                let orderId = date + timestamp; //20190524155866554500
    
    展开全文
  • 分布式开发唯一订单编号生成工具类前言:雪花算法关于雪花算法原理描述算法实现工具类 前言: 随着分布式的开发和高并发的业务场景,例如订单编号的生成,简单的自增长的主键由于自身的缺陷已无法满足我们的生产需要,...

    分布式开发唯一订单编号生成工具类

    前言:

    随着分布式的开发和高并发的业务场景,例如订单编号的生成,简单的自增长的主键由于自身的缺陷已无法满足我们的生产需要,所以小编在这里分享一个基于雪花算法的id生成器的工具类.

    雪花算法

    关于雪花算法

    有这么一种说法,自然界中并不存在两片完全一样的雪花的。每一片雪花都拥有自己漂亮独特的形状、独一无二。雪花算法也表示生成的ID如雪花般独一无二。

    在这里插入图片描述

    原理

    SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:

    在这里插入图片描述

    描述

    最高位是符号位,始终为0,不可用。
    41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
    10位的机器标识,10位的长度最多支持部署1024个节点。
    12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。

    算法实现工具类

    /**
     * <p>名称:IdWorker.java</p>
     * <p>描述:分布式自增长ID</p>
     * <pre>
     *     Twitter的 Snowflake JAVA实现方案
     * </pre>
     * 核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用:
     * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000
     * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,
     * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),
     * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。
     * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),
     * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。
     * <p>
     * 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))
     *
     * @author cmm
     */
    public class IdWorker {
        // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
        private final static long twepoch = 1288834974657L;
        // 机器标识位数
        private final static long workerIdBits = 5L;
        // 数据中心标识位数
        private final static long datacenterIdBits = 5L;
        // 机器ID最大值
        private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);
        // 数据中心ID最大值
        private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
        // 毫秒内自增位
        private final static long sequenceBits = 12L;
        // 机器ID偏左移12位
        private final static long workerIdShift = sequenceBits;
        // 数据中心ID左移17位
        private final static long datacenterIdShift = sequenceBits + workerIdBits;
        // 时间毫秒左移22位
        private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
    
        private final static long sequenceMask = -1L ^ (-1L << sequenceBits);
        /* 上次生产id时间戳 */
        private static long lastTimestamp = -1L;
        // 0,并发控制
        private long sequence = 0L;
    
        private final long workerId;
        // 数据标识id部分
        private final long datacenterId;
    
        public IdWorker() {
            this.datacenterId = getDatacenterId(maxDatacenterId);
            this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);
        }
    
        /**
         * @param workerId     工作机器ID
         * @param datacenterId 序列号
         */
        public IdWorker(long workerId, long datacenterId) {
            if (workerId > maxWorkerId || workerId < 0) {
                throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
            }
            if (datacenterId > maxDatacenterId || datacenterId < 0) {
                throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
            }
            this.workerId = workerId;
            this.datacenterId = datacenterId;
        }
    
        /**
         * 获取下一个ID
         *
         * @return
         */
        public synchronized long nextId() {
            long timestamp = timeGen();
            if (timestamp < lastTimestamp) {
                throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
            }
    
            if (lastTimestamp == timestamp) {
                // 当前毫秒内,则+1
                sequence = (sequence + 1) & sequenceMask;
                if (sequence == 0) {
                    // 当前毫秒内计数满了,则等待下一秒
                    timestamp = tilNextMillis(lastTimestamp);
                }
            } else {
                sequence = 0L;
            }
            lastTimestamp = timestamp;
            // ID偏移组合生成最终的ID,并返回ID
            long nextId = ((timestamp - twepoch) << timestampLeftShift)
                    | (datacenterId << datacenterIdShift)
                    | (workerId << workerIdShift) | sequence;
    
            return nextId;
        }
    
        private long tilNextMillis(final long lastTimestamp) {
            long timestamp = this.timeGen();
            while (timestamp <= lastTimestamp) {
                timestamp = this.timeGen();
            }
            return timestamp;
        }
    
        private long timeGen() {
            return System.currentTimeMillis();
        }
    
        /**
         * <p>
         * 获取 maxWorkerId
         * </p>
         */
        protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
            StringBuffer mpid = new StringBuffer();
            mpid.append(datacenterId);
            String name = ManagementFactory.getRuntimeMXBean().getName();
            if (!name.isEmpty()) {
                /*
                 * GET jvmPid
                 */
                mpid.append(name.split("@")[0]);
            }
            /*
             * MAC + PID 的 hashcode 获取16个低位
             */
            return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
        }
    
        /**
         * <p>
         * 数据标识id部分
         * </p>
         */
        protected static long getDatacenterId(long maxDatacenterId) {
            long id = 0L;
            try {
                InetAddress ip = InetAddress.getLocalHost();
                NetworkInterface network = NetworkInterface.getByInetAddress(ip);
                if (network == null) {
                    id = 1L;
                } else {
                    byte[] mac = network.getHardwareAddress();
                    id = ((0x000000FF & (long) mac[mac.length - 1])
                            | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;
                    id = id % (maxDatacenterId + 1);
                }
            } catch (Exception e) {
                System.out.println(" getDatacenterId: " + e.getMessage());
            }
            return id;
        }
    
    
    }
    
    
    使用雪花算法的好处是,生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),并且效率较高,snowflake每秒能够产生26万ID左右,完全满足高并发的需要。
    
    展开全文
  • 订单编号生成方案研究

    千次阅读 2017-04-20 13:00:48
    需求:订单编号为30位左右的数字编号 不再采用自增方式(自增方式容易被利用) 订单编号具有基本的可读性(如年月日的可读性) 企业标识(2位数字)+ 业务标识(2位数字)+ 自定义(n位数字) 无论什么情况都不...
  • 订单编号生成策略

    2017-03-09 20:12:00
    如果订单编号全是使用随机码随机生成(例如UUID),那么这个编码本身就是一个没有意义的数据,对于我们后续的分析数据一点作用都没有。 但是采用2~3位随机码和流水号混合使用的策略,可以隐藏流水号的真实数据。 ...
  • 不重复订单生成 参考: https://mp.weixin.qq.com/s/GB1wsr9-IxLRYPbjavbBgw 单机生成 /** 订单生成(NEW) **/ private static final AtomicInteger SEQ = new AtomicInteger(1000); private static final ...
  • Java订单编号生成(安全永不重复)

    万次阅读 热门讨论 2018-07-20 15:59:52
    import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date;... * 订单编码码生成器,生成32位数字编码,  * @生成规则 1位单号类型+17位时间戳+14位(用户id加密&a...
  • public static String orderId(){ String code = DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"); String random = ((int) ((Math.random() * 9 + 1) * 1000)) + "";...//订单号产生 publ...
  • 简单实用的java项目生成 日期时间 + 六位升序流水号 参考范例代码。一看就懂。
  • import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;.../*** 订单编码码生成器,生成32位数字编码,* @生成规则 1位单号类型+17位时间戳+14位(用户id加密&随机数)* Dat...
  • 这一章其实应该在前面就要写到...订单编号生成规则1.0的时候,平台用到是UUID32位,简单粗暴,但是2.0平台的时候订单流水号要赋予更多的价值意义,比如通过订单可以知道所在区域,当天订单所在的数目等等,所以订...
  • 分布式系统下 我们每台设备(分布式系统-独立的应用空间-或者docker环境) * SnowFlake的优点是,整体上按照时间...所以我们可以为分布式系统下:分库分表主键,分库,多库的情况下的订单编号使用这种方式进行唯一numbe...
  • 1、订单头/**订单类别头*/privatestaticfinalStringORDER_CODE="1";/**退货类别头*/privatestaticfinalStringRETURN_ORDER="2";/**退款类别头*/privatestaticfinalStringREFUND_ORDER="3";/**未付款重新支付别头*/...
  • MySQL函数生成订单编号

    千次阅读 2019-08-02 15:30:56
    文章目录编号生成器基础方法资金流水编号生成器订单编号生成器 编号生成器基础方法 CREATE DEFINER=`root`@`localhost` FUNCTION `f_app_seq`(`in_seq_name` varchar(16)) RETURNS varchar(16) CHARSET utf8 BEGIN /...
  • 生成订单编号

    万次阅读 2019-06-17 21:28:44
    如何将订单编号自动生成,然后根据所生成的编号保存到数据库中。首先要在控制器里面写一个生成编号的方法,在方法里面首先声明一个空的字符串,然后用linq 查询出该表中的单号字段,然后用orderbay对单号进行排序,...
  • } } /** * 生成订单编号 * @return */ public static synchronized String getOrderNo() { String str = new SimpleDateFormat("yyMMddHHmm").format(new Date()); if(date==null||!date.equals(str)){ date = str;...
  • //构造订单号 StringBuffer orderId = new StringBuffer("WJY" + DateStr + istr);; return orderId.toString(); } } 这个流水号同一天肯定是不能重复的 我想设计成这样的格式 __________________________ | ...
  • 订单编号唯一键生成

    2020-09-22 09:39:01
    //订单编号,唯一键生成 时间戳+随机数 /** * 唯一键生成 */ public static String OrderIdUtilStr() { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat(“yyyyMMddHHmmsss”); String ...
  • 生成流水订单编号

    2016-08-13 14:39:00
    mysql 生成流水订单号 存储过程 订单编号 测试订单表(test_orders): CREATETABLE 'test_orders'( 'id'int(11)NOTNULLAUTO_INCREMENT, 'orderNo'varchar(25)NOTNULLDEFAULT'', 'orderName'char(10)...
  • php-生成订单编号

    2019-11-25 15:33:18
    生成每天从1开始的订单编号 固定参数+年月日+2位随机码+4位流水号+2位随机码 //生成订单编号 public function setOrderId($allianceid){ if(empty($allianceid)){ return false; } $date = date('Y')....
  • java生成订单编号

    千次阅读 2019-09-25 14:07:18
    那么如何在当前系统生成唯一编号呢? 一台数据库可以用自增,集群呢?当然也有随之的解决方案,但是最好的还是在项目生成了唯一的编号再插入到数据库。而不是数据库插入了再返回来,因为这中间多了一步查询的过程。...
  • 随机生成订单编号

    千次阅读 2019-03-11 16:01:19
    /** * 最大支持1-9个集群的机器部署 */ public static final int MACHINE_ID... * 生成订单号 */ public static String getOrderNumber() { int machineId = MACHINE_ID; int hashCodeV = UUID.randomUUID().to...
  • } } /** * 生成订单编号 * @return */ public static synchronized String getOrderNo() { String str = new SimpleDateFormat("yyMMddHHmm").format(new Date()); if(date==null||!date.equals(str)){ date = str;...
  • } } /** * 生成订单编号 * @return */ public static synchronized String getOrderNo() { String str = new SimpleDateFormat("yyMMddHHmm").format(new Date()); if(date==null||!date.equals(str)){ date = str;...
  • package ...import java.text.SimpleDateFormat;import java.util.Date;import java.util.Random;/** * 单例模式 * 生成订单编号 */public class SingletonUtil { private volatile static Sing...
  • } } 还有另外一种方式使用用户的编号+时间戮 snowflake忽然想到一个问题,不能随便调整服务器的时间 import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.net....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 800
精华内容 320
关键字:

订单编号生成