java高性能订单流水号永远不重复8位数

因为在做多线程执行订单所以要遇到订单号重复的问题,所以希望帮帮忙,高性能订单流水号永远不重复8位数

第1个回答  2018-01-15
8位数 也就是 1~99999999
然后你直接生成的随机数 校对数据库是否存在这个数,存在你就再次调用随机数,不存在你就用这个随机数,并且保存到数据库(注:不满8位,比如1,你就字符串拼接 00000001,再比如 79233 ,你拼接位00079233)追问

我是批量新增大数据,这样效率太慢了,我一分钟批量新增1万5千条

追答

那我没办法了,要是位数长一点,可以用年月日时分秒毫秒。

第2个回答  2018-01-15
redis自增,然后补齐8位就行追问

redis自增是什么

追答

网页链接
如果位数可以放宽点的话,可以使用uuid或者uuid-short。
我一般是用日期格式+自增id,如20180115(日期) + 0000001(自增id) 这样的格式

追问

自增Id怎么来的

追答

redis知道吗?如果是分布式的话,自增id可以从redis获取
如果是只有一个程序,也就是单机的话,可以直接new 一个 AtomicInteger,可以参考我的代码

public class Test implements Runnable {

private AtomicInteger count;
private CountDownLatch countDownLatch;

public Test(AtomicInteger count, CountDownLatch countDownLatch) {
this.count = count;
this.countDownLatch = countDownLatch;
}

public static void main(String[] args) throws InterruptedException {
AtomicInteger count = new AtomicInteger(0);
Long startTime = System.currentTimeMillis();
CountDownLatch countDownLatch = new CountDownLatch(100);
for (int i = 0; i < 100; i++) {
Test test = new Test(count, countDownLatch);
Thread thread = new Thread(test);
thread.start();
}
countDownLatch.await();
Long endTime = System.currentTimeMillis();
System.out.println("用时:" + (endTime - startTime));
System.out.println("count:" + count.get());
}

@Override
public void run() {
for (int i = 0; i < 10000; i++) {
count.incrementAndGet();
}
countDownLatch.countDown();
}
}

本回答被提问者采纳
第3个回答  2018-01-15
加个list 把数字加进去 去重追问

难道我每次都要从数据库查出来订单号来进行判断是否重复

追答

在没有思路的情况下 有条路可走总比没有强,以后有其他路再改就是了

追问

我现在就是获取系统毫秒数截取然后加3位随机数,但是我觉得以后会重复,因为我截取的毫秒数是后面5位

我现在就是获取系统毫秒数截取然后加3位随机数,但是我觉得以后会重复,因为我截取的毫秒数是后面5位