分布式情况下生成唯一Id

在分布式的情况下要生成唯一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();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值