场景
当我们向数据库加一条字段时,默认会生成一个当前13位毫秒级时间戳,在有些并发场景下不想要生成重复的时间戳,这篇文章来探讨解决方案。
场景演示
这里模拟10万并发量
public static void main(String[] args) {
long start = System.currentTimeMillis();
Set<Long> t1=new HashSet<>();
Set<Long> t2=new HashSet<>();
//测试10万并发量
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (int i=1;i<=100000;i++){
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
t1.add(System.currentTimeMillis());
t2.add(System.nanoTime());
});
futures.add(future);
}
futures.forEach(future->{
while (!future.isDone()){}
});
System.out.println("任务量:"+futures.size());
System.out.println("毫秒时间戳不重复的数据条数:"+t1.size());//117
System.out.println("微秒时间戳不重复的数据条数:"+t2.size());//88192
System.out.println("执行耗时:"+(System.currentTimeMillis()-start)+" ms");//254ms
}
}
可以发现 毫秒时间戳重复率特别高 10万条数据只有117个不重复值,而微秒有88192个不重复值。
解决方案
直接使用nano获取本地时间[doge]