在分布式的情况下要生成唯一Id,需要考虑高并发,多机器的情况
一个思路就是 机器码-时间戳-索引,代码如下:
public class Test {
private static String macAddress; // 本机机器码
private ReentrantLock lock = new ReentrantLock(); // 可重入锁
private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
private String time; // 当前时间
private AtomicInteger incIndex = new AtomicInteger(0); // 同一时间的索引
static {
try {
Process process = Runtime.getRuntime().exec(new String[] { "wmic", "cpu", "get", "ProcessorId" });
process.getOutputStream().close();
Scanner sc = new Scanner(process.getInputStream());
sc.next();
macAddress = sc.next();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取Elasticsearch的数据ID
* @return
*/
protected String getUnRepeatedId() {
try {
lock.lock();
String now = LocalDateTime.now().format(dateTimeFormatter);
StringBuffer sb = new StringBuffer(macAddress).append("-").append(now).append("-");
if(now.equals(time)) {
sb.append(incIndex.incrementAndGet());
} else {
time = now;
incIndex.set(0);
sb.append(incIndex.incrementAndGet());
}
return sb.toString();
} finally {
lock.unlock();
}
}
}