随着项目用户数量的扩大,高并发随之而来。那么如何在当前系统生成唯一编号呢?

一台数据库可以用自增,集群呢?当然也有随之的解决方案,但是最好的还是在项目生成了唯一的编号再插入到数据库。而不是数据库插入了再返回来,因为这中间多了一步查询的过程。

当然很多人会讲用这个那个技术,比如 redis 等等,当然能做到。你redis研究的很深,集成事务等等。但是又怎么样呢?redis最擅长的还是 key—value,每秒的吞吐量有10万,但是集成了事务等等有吗?肯定没有。

你别忘了这是个算法问题,你就没想想这个问题要怎么实现,细节。这是一个简单的问题,不需要涉及到高等数学。

下面是我生成编号的一个类。

思路:首先获取 年月日时分秒毫秒的一个时间戳(格式很规范,这样生成的编号特别是订单一目了然),再在这一毫秒内对唯一做一个区别。就是一个编号哪来的那么复杂。


import java.text.SimpleDateFormat;import java.util.Date;import java.util.UUID;

/**         * Title: 生成UUID */      public class CodecUtil {

   private static Integer number;//唯一数字,集群第一台=0,第二台=200000,第三台=400000   private static int maxNum=200000;//最大值,集群第一台=200000,第二台=400000,第三台=600000   private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");//年月日格式

   /**    * uuid生成没有 — 的编号    * @return    */   public static String createUUID(){      String uuid = UUID.randomUUID().toString();      return uuid.replaceAll("\\-", "");   }

   /**    * 生成订单编号 17+ 位数    *  思路:一个业务在1毫秒内并发的数量有多少,有一万那真是顶天了,意味着 一秒 有1000万的并发。kafaka,redis的性能不过10万,那我把 number的上限设置成20 万,那就是一秒200000*1000=2亿的并发,不够再集群    *  宕机了,进程死了,这个跟程序没有关系。你别忘了前面精确到毫秒的17位数,我们只关心一毫秒内的并发问题    * @return    */   public static String createOrderId(){      number++;//唯一数字自增      if(number>=maxNum){ // 值的上限,超过就归零         number=maxNum-200000;      }      return sdf.format(new Date())+number;//返回时间+一毫秒内唯一数字的编号,区分机器可以加字母ABC...   }

}
 

java生成订单编号的更多相关文章

  1. JAVA生成订单编号工具类

    JAVA根据时间戳和随机数方式生成订单编号工具类 OrderUtils.java package com.util; import java.text.DateFormat; import java. ...

  2. Loadrunner时间函数、用时间生成订单编号例子

    Loadrunner中取时间函数.用时间函数生成订单编号例子: <如要转载,请注明网络来源及作者:Cheers_Lee> 问题的提出: (1)有时候在Loadrunner中用C语言设计脚本 ...

  3. Java 编程 订单、支付、退款、发货、退货等编号主动生成类

    订单.支付.退款.发货.退货等编号主动生成类 在商城网站中,订单编号的自动生成,ERP中各个单据的编号自动生成,都可以按照一下的方式来自动生成. 第一步:定义常量订单编号前缀.订单编号起始数.订单编号 ...

  4. 编写Java程序,模拟网上商城购物,当用户选好物品提交订单时,每笔订单会自动生成一个唯一的订单编号。

    查看本章节 查看作业目录 需求说明: 模拟网上商城购物,当用户选好物品提交订单时,每笔订单会自动生成一个唯一的订单编号.而部分电子商务网站在数据高峰期时,一毫秒可能需要处理近千笔的订单 现在简单模拟 ...

  5. 分布式系统-主键唯一id,订单编号生成-雪花算法-SnowFlake

    分布式系统下 我们每台设备(分布式系统-独立的应用空间-或者docker环境) * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作 ...

  6. PHP + Redis 生成自定义订单编号

    /** * 订单编号生成规则 * 14位 = 6位时间 + 5位自增 + 3位ID * @param string $prefix 前缀: 默认为order * @param int $userId ...

  7. java生成解析xml的另外两种方法JAXB

     JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反 ...

  8. 生成订单:三个表(Products,Orders,OrderItem)

    1.有三个表(Product上,Orders,OrderItem) 分别创建对应的三个实体类 OrderItem中有外键Order_id 参考Orders中的id :Product_id参考Produ ...

  9. Java生成CSV文件实例详解

    本文实例主要讲述了Java生成CSV文件的方法,具体实现步骤如下: 1.新建CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils ...

随机推荐

  1. 六、Linux_SSH服务器状态

    一.保持Xshell连接Linux服务器状态 1.登录服务器后 cd /etc/ssh/ vim sshd_config 找到 ClientAliveInterval 0和ClientAliveCou ...

  2. Gerrit和OpenLDAP服务器集成

    Gerrit和OpenLDAP服务器集成 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装LDAP服务器 详情请参考:https://www.cnblogs.com/yinz ...

  3. GTID主从与传统主从复制

    目录 1.主从复制 2.靠什么同步 3.pos与GTID的什么区别 4.GTID的工作原理 5.GTID参数配置 5.1 在主数据库里创建一个同步账号授权给从数据库使用 5.2 配置主数据库 5.3配 ...

  4. 泛微 e-cology OA 远程代码执行漏洞复现

    0x00 前言 Poc已在github公开,由于环境搭建较为复杂,所以我在空间搜索引擎中找了国外的网站进行复现 如果有想自行搭建环境复现的可以在公众号内回复“泛微环境”即可获取源码及搭建方式 0x01 ...

  5. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

  6. Python+Appium学习之启动手机APP或者浏览器

    一.启动浏览器:pycharm中python脚本如下: from appium import webdriver desired_caps ={ 'platformName':'Android', ' ...

  7. YII2 更新数据不成功

    起因: CLI模式,定时任务.同步其他系统中的DB数据,通过视图的方式. 历程: 原脚本已经写好,实在已经有的基础上修改,增加新的字段. 加了字段后,执行,但始终不成功,表里记录的utime也是能更新 ...

  8. flume的sink写入hive表

    flume的配置文件如下: a1.sources=r1 a1.channels=c1 a1.sinks=s1 a1.sources.r1.type=netcat a1.sources.r1.bind= ...

  9. Spark Partition

    分区的意义 Spark RDD 是一种分布式的数据集,由于数据量很大,因此它被切分成不同分区并存储在各个Worker节点的内存中.从而当我们对RDD进行操作时,实际上是对每个分区中的数据并行操作.Sp ...

  10. [Dart] Mixin

    Docs Mixins are a way of reusing a class’s code in multiple class hierarchies. void main() { Animal ...