java生成订单编号

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

一台数据库能够用自增,集群呢?固然也有随之的解决方案,可是最好的仍是在项目生成了惟一的编号再插入到数据库。而不是数据库插入了再返回来,由于这中间多了一步查询的过程。redis

固然不少人会讲用这个那个技术,好比 redis 等等,固然能作到。你redis研究的很深,集成事务等等。可是又怎么样呢?redis最擅长的仍是 key—value,每秒的吞吐量有10万,可是集成了事务等等有吗?确定没有。算法

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

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

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

 
 
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...   }}
相关文章
相关标签/搜索