酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

java项目如何实现分布式id,附代码

在Java项目中,可以使用雪花算法(Snowflake)来实现分布式ID。以下是一个简单的雪花算法实现: ```java public class SnowflakeIdWorker { // 开始时间戳(2015-01-01) private final long twepoch = 1420041600000L; // 机器id所占的位数 private final long workerIdBits = 5L; // 数据标识id所占的位数 private final long datacenterIdBits = 5L; // 支持的最大机器id,结果是31(二进制:11111) private final long maxWorkerId = -1L ^ (-1L << workerIdBits); // 支持的最大数据标识id,结果是31(二进制:11111) private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); // 序列在id中占的位数 private final long sequenceBits = 12L; // 机器ID向左移12位 private final long workerIdShift = sequenceBits; // 数据标识id向左移17位(12+5) private final long datacenterIdShift = sequenceBits + workerIdBits; // 时间戳向左移22位(5+5+12) private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; // 生成序列的掩码,这里为4095(二进制:111111111111) private final long sequenceMask = -1L ^ (-1L << sequenceBits); // 工作机器ID(0~31) private long workerId; // 数据中心ID(0~31) private long datacenterId; // 毫秒内序列(0~4095) private long sequence = 0L; // 上次生成ID的时间戳 private long lastTimestamp = -1L; public SnowflakeIdWorker(long workerId, long datacenterId) { if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); } if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } public synchronized long nextId() { long timestamp = timeGen(); if (timestamp < lastTimestamp) { throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); } if (lastTimestamp == timestamp) { sequence = (sequence + 1) & sequenceMask; if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; } protected long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } protected long timeGen() { return System.currentTimeMillis(); } public static void main(String[] args) { SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0); for (int i = 0; i < 1000; i++) { long id = idWorker.nextId(); System.out.println(id); } } } ``` 这个实现中,`SnowflakeIdWorker`类包含了生成分布式ID的主要逻辑。你可以通过创建`SnowflakeIdWorker`实例并调用`nextId()`方法来生成新的ID。在`main`方法中,我们创建了一个`SnowflakeIdWorker`实例,并生成了1000个ID作为示例。 [2024-06-21 17:55:28 | AI写代码神器 | 1084点数解答]

相关提问