生成订单号
/**
* 生成11位订单号,日期占6位 + 5位0~100000之间的不重复随机数,例如:21031403607
*
*/
public class RandomNumbers {
private static final Jedis jedis;
static {
System.out.println(1);
//连接redis
JedisPool jedisPool = new JedisPool("127.0.0.1", 6379, null, "root");
jedis = jedisPool.getResource();
//当天不更新,方便调试时不会出现重复订单号
String today = new SimpleDateFormat("yyyyMMdd").format(new Date());
if (!today.equals(jedis.get("randomNumbers:today"))) {
//存入今天日期
jedis.set("randomNumbers:today", today);
jedis.persist("randomNumbers:today");
//初始化计数器
jedis.set("randomNumbers:counter", "-1");
jedis.persist("counter");
List<String> numberList = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
numberList.add(String.valueOf(i));
}
//乱序
Collections.shuffle(numberList);
for (int i = 0; i < 100; i++) {
List<String> list = numberList.subList(i * 1000, (i + 1) * 1000);
//清空已存在的列表
jedis.del("randomNumbers:" + i);
jedis.rpush("randomNumbers:" + i, list.toArray(new String[0]));
//永不过期
jedis.persist("randomNumbers:" + i);
}
}
}
public static String createOrder() {
//获取索引
long index = jedis.incr("randomNumbers:counter") % 100000;
//查询字段
StringBuilder number = new StringBuilder(jedis.lindex("randomNumbers:" + index / 1000, index % 1000));
int MissingLenth = 5 - number.length();
for (int i = 0; i < MissingLenth; i++) {
number.insert(0, "0");
}
return new SimpleDateFormat("yyyyMMdd").format(new Date()).substring(2) + number;
}
//测试bug
@Test
public void testBug() {
List<String> list = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
String order = createOrder();
if (order.length() != 11) {
System.out.println(order);
throw new RuntimeException("订单号长度有bug");
}
if (list.contains(order)) {
System.out.println(order);
throw new RuntimeException("订单号重复出现!");
} else {
list.add(order);
}
}
}
//测试性能
@Test
public void testSpeed() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
createOrder();
}
long endTime = System.currentTimeMillis();
System.out.println("平均每个订单号生成耗时" + (endTime - startTime) / 100000.0 + "ms");
}
}