前言
在做項目中經常遇到需要唯一業務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自增等,不同的業務生成規則也不一樣,具體問題具體分析。
總結
以上五種生成方式基本上是平時開發中比較常用的生成唯一標識的方式,每種方式各有不同,但是最終期望都是不重複,正所謂條條大路通羅馬,目的是一樣的。大家可以根據自己的業務需求選擇合適的生成方式,不要侷限於形式。