前言
在做项目中经常遇到需要唯一业务id的生成,比如:支付订单号,外卖订单号,地址id,用户id...等等,这样的场景太多了,今天就总结一下常用的生成方式。
排行榜
NO.1 UUID生成方式
基本上做过项目的都接触过jdk自带的UUID生成一串字符串,使用方式也很简单,如下:
UUID.randomUUID().toString().replace("-","");
UUID应该是最常用也是最方便的一种生成方式了,基本上不会重复,之所以说基本上不会重复,是因为我遇到过重复的,机率很小很小,千万分之一的概率。
NO.2 时间戳+随机数
时间戳精确到毫秒+指定位数的随机数也是一种常用的生成方式,虽然这种做法也不能保证百分之百的不重复,但是一般公司都没这么大的QPS,所以在并发量不是特别高的场景下也是一种不错的手段。生成方式也很简单,如下:
public class BusinessPrimaryKeyBuildUtil {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
/**
* 业务主键默认年月日时分秒毫秒+10位随机数
*
* @return
*/
public static String build() {
LocalDateTime dateTime = LocalDateTime.now();
return FORMATTER.format(dateTime) + RandomStringUtils.randomNumeric(10);
}
/**
* 根据业务需求生成不同长度随机数的业务主键
*
* @param length
* @return
*/
public static String buildByLength(int length) {
LocalDateTime dateTime = LocalDateTime.now();
return FORMATTER.format(dateTime) + RandomStringUtils.randomNumeric(length);
}
}
NO.3 雪花算法
这里可以参考我上一篇的文章:分布式ID生成之雪花算法。雪花算法只保证一定年限内不重复,但是在一般项目也活不够百年,所以在一定时间内是可以保证不重复的。
NO.4 随机字符串
这种方法是利用Random的随机性来生成的,因为长度可以自定义,在一定程度上是不会重复的,但是不能保证百分只百的不重复,生成一些类目的code还是可以用一下的,其他高并发场景下不推荐使用,其生成方式也很简单,如下:
public static String generateMixString(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".charAt(random.nextInt("abcdefghijkllmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".length())));
}
return sb.toString();
}
NO.5 业务编码+业务规则
这种场景一般用于有具体业务含义的,例如支付订单以1111开头,外卖订单以2222开头,或者是SDB,SB等等,不同的编码代表不同的业务含义,再加上产品给出的业务规则,例如:以yymmdd+0001规则递增,或者yymmdd+1001+1000自增等,不同的业务生成规则也不一样,具体问题具体分析。
总结
以上五种生成方式基本上是平时开发中比较常用的生成唯一标识的方式,每种方式各有不同,但是最终期望都是不重复,正所谓条条大路通罗马,目的是一样的。大家可以根据自己的业务需求选择合适的生成方式,不要局限于形式。