目录
1 什么是雪花算法?
结构
优点
缺点
2 在java中使用
使用注意:
测试代码
效果
1 什么是雪花算法?
witter的雪花算法(Snowflake Algorithm)。雪花ID是一种分布式唯一ID生成算法,旨在解决分布式系统中生成唯一ID的需求。
结构
雪花ID的结构如下:
0 | 00000000000000000000000000000000000000 | 00000 | 00000 | 000000000000
- 第一位(最高位)是符号位,通常为0。
- 接下来的41位是时间戳,用于记录生成ID的时间。
- 然后是10位的工作机器ID,用于标识不同的机器。
- 一般来说工作机器ID分为工作节点ID和数据中心ID,各占5bit
- 最后是12位的序列号,用于解决同一毫秒内生成多个ID的冲突问题。
通过这种结构,雪花ID可以在分布式系统中生成唯一的、有序的ID。
优点
高效、趋势递增、可排序,同时不依赖于外部数据库或网络。
缺点
雪花ID算法虽然在分布式系统中生成唯一ID的需求上有很多优点,但也存在一些潜在的缺点:
1. 依赖于机器时钟:雪花ID的时间戳部分依赖于生成ID的机器的系统时钟。如果机器的时钟发生回拨或不同步,可能会导致生成的ID不唯一或不正确。
2. 时钟回拨问题:如果机器的时钟回拨,可能会导致生成的ID比之前生成的ID要小。这可能会引发一些潜在的问题,例如在某些场景下无法正确排序或索引。
3. 高并发下的序列号重复:如果在同一毫秒内生成的ID请求非常高,可能会导致序列号部分不足以保证唯一性。这种情况下,需要额外的策略来解决并发生成ID的冲突。
4. 扩展性限制:雪花ID的结构中包含了工作机器ID和数据中心ID,这限制了系统的扩展性。如果需要增加机器或数据中心数量,可能需要重新分配ID范围或修改算法。
5. 需要单点生成ID:为了保证ID的唯一性,需要集中式的ID生成器来分配工作机器ID和数据中心ID。这可能成为系统的单点故障或性能瓶颈。
尽管雪花ID算法存在一些缺点,但在大多数情况下,它仍然是一种可行且广泛使用的分布式唯一ID生成方案。根据具体的应用场景和需求,可以考虑使用其他ID生成算法或采取额外的措施来解决这些缺点。
2 在java中使用
我们直接借助hutool工具包帮我们实现了雪花算法
依赖
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>
使用注意:
工作机器ID分为工作节点ID和数据中心ID,各占5bit,所以workerID和datacenterId最大31
测试代码
/** 测试 */public static void main(String[] args) {// workerID和datacenterId最大31Snowflake snowflake = IdUtil.getSnowflake(0, 31);for (int i = 0; i < 10; i++) {System.out.println(snowflake.nextId());}}