随着项目用户数量的扩大,高并发随之而来。那么如何在当前系统生成惟一编号呢?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... }}