雪花算法生成id分析与实践

目录

1 什么是雪花算法?

结构

优点

缺点

2 在java中使用

使用注意: 

测试代码

效果


扫描二维码关注公众号,回复: 17105159 查看本文章

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最大31
        Snowflake snowflake = IdUtil.getSnowflake(0, 31);
        for (int i = 0; i < 10; i++) {
            System.out.println(snowflake.nextId());
        }
    }

效果

猜你喜欢

转载自blog.csdn.net/qq_53679247/article/details/132651246