文章目录
随机生成 “纯数字”、“纯字母” 、“数字字母混合” ID并保持全局唯一
一、随机生成纯数字ID
/**
* 随机生成字符,只有数字
* @param length id长度
*/
public static String getNumber(Integer length) {
String uid = "";
for (Integer i = 0; i < length; i++) {
String randChar = String.valueOf(Math.round(Math.random() * 9));
uid = uid.concat(randChar);
}
return uid;
}
二、随机生成纯字母ID
/**
* 随机生成字符,只有大写字母
* @param length id长度
*/
public static String getUppercaseLetter(Integer length) {
String uid = "";
for (Integer i = 0; i < length; i++) {
String randChar = String.valueOf((char) Math.round(Math.random() * 25 + 65));
uid = uid.concat(randChar);
}
return uid;
}
/**
* 随机生成字符,只有小写字母
* @param length id长度
*/
public static String getLowercaseLetter(Integer length) {
String uid = "";
for (Integer i = 0; i < length; i++) {
String randChar = String.valueOf((char) Math.round(Math.random() * 25 + 65));
uid = uid.concat(randChar);
}
return uid;
}
三、随机生成数字字母混合 ID
/**
* 随机生成字符,含大写、数字
* @param length id长度
*/
public static String getUppercaseLetterAndNumber(Integer length) {
String uid = "";
for (Integer i = 0; i < length; i++) {
int index = (int) Math.round(Math.random() * 1);
String randChar = "";
switch (index) {
case 0:
//大写字符
randChar = String.valueOf((char) Math.round(Math.random() * 25 + 65));
break;
default:
//数字
randChar = String.valueOf(Math.round(Math.random() * 9));
break;
}
uid = uid.concat(randChar);
}
return uid;
}
/**
* 随机生成字符,含大写、小写、数字
* @param length id长度
*/
public static String getLowercaseAndUppercaseLettersAndNumber(Integer length) {
String uid = "";
for (Integer i = 0; i < length; i++) {
int index = (int) Math.round(Math.random() * 2);
String randChar = "";
switch (index) {
case 0:
//大写字符
randChar = String.valueOf((char) Math.round(Math.random() * 25 + 65));
break;
case 1:
//小写字符
randChar = String.valueOf((char) Math.round(Math.random() * 25 + 97));
break;
default:
//数字
randChar = String.valueOf(Math.round(Math.random() * 9));
break;
}
uid = uid.concat(randChar);
}
return uid;
}
四、如何保持全局唯一 ?
思路:利用 redis 中间件,把出现过的 id 放进 redis 的 set 集合里面,每一次生成都需要从 redis 的集合里面判断一次,如存在则重新生成。
缺点:存在性能问题,尤其是批量获取的时候,需要重复去 redis 里面判断这个id 是否存在,解决方案看下。
五、如何批量获取并不会出现性能问题 ?
思路:设计一个存放 id 的池子,比如服务启动的预置 xxx 个,并定时查询池子的 id 数量是否低于 水平线,低于则补充。如果取的时候发现池子里的 id 数量不够的话,则返回提示,这个时候只有补充到充足的数量才能获取。需要设计两个池子,一个是放使用过的 id ,一个方未使用的 id 。