雪花算法 java 实现代码
时间: 2024-10-24 13:08:12 浏览: 24
雪花算法java实现例子
雪花算法(Snowflake)是一种分布式ID生成方案,它通常用于数据库自增ID,能够生成全局唯一的ID,同时考虑到时间序列和机器标识。在Java中,可以使用SnowFlake ID Generator库来进行简单实现。下面是一个基本的Java示例,使用`snowflake-id-generator`库:
```java
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
public class SnowflakeIdGenerator {
private static final long SEED = 0x7b58c965e84dd1f0L; // 雪花算法的种子值
private static final long WORKER_ID_SHIFT = 16; // 工作机ID左移16位
private static final long DATA_CENTER_ID_SHIFT = 56; // 数据中心ID左移56位
private static final long TIMESTAMP_LEFT_SHIFT = 22; // 时间戳左移22位
private static final long MAX_TIMESTAMP = -1L << TIMESTAMP_LEFT_SHIFT;
private static final long MAX_WORKER_ID = -1L << WORKER_ID_SHIFT;
private static final long MAX_DATA_CENTER_ID = -1L << DATA_CENTER_ID_SHIFT;
private static final long MASK = ~(-1L << 64); // 每个字段的最大值
private static final Cache<Long, Long> cache = Caffeine.newBuilder()
.maximumSize(10_000) // 缓存大小,可以根据实际情况调整
.expireAfterWrite(5, TimeUnit.MINUTES) // 缓存过期时间
.build();
public static long generateId() {
return nextId();
}
private static long nextId() {
long timestamp = System.currentTimeMillis();
if (timestamp > MAX_TIMESTAMP) {
throw new RuntimeException("Timestamp exceeds the maximum allowed value");
}
// 获取当前工作进程ID和数据中心ID
long workerId = Thread.currentThread().getId() & MAX_WORKER_ID;
long dataCenterId = Node.currentNode().getNodeId() & MAX_DATA_CENTER_ID;
long id = ((timestamp << TIMESTAMP_LEFT_SHIFT) |
(dataCenterId << DATA_CENTER_ID_SHIFT) |
(workerId << WORKER_ID_SHIFT)) & MASK;
// 通过缓存避免频繁计算,减少网络请求或数据库查询
Long cachedValue = cache.getIfPresent(id);
if (cachedValue != null) {
return cachedValue;
}
// 将ID放入缓存,并返回给用户
cache.put(id, id);
return id;
}
}
```
这个例子中,我们首先创建了一个线程安全的本地缓存,然后在每次生成ID之前检查是否有缓存。如果存在,则直接返回;否则,计算新的ID并放入缓存。
注意,这只是一个基础实现,实际生产环境中可能还需要处理网络延迟、时钟同步等问题。
阅读全文