一、介绍Hutool工具:

     官网地址:简介 | Hutool

     Hutool是一个Java工具库,其中包含了各种实用的工具类和方法。通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

     Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug

二、雪花算法:

 1.介绍:

      雪花算法(Snowflake)是一种分布式唯一ID生成算法,它可以在分布式系统中生成全局唯一的ID。该算法由Twitter开发,用于解决分布式系统中生成唯一ID的需求。

 2.核心思想:

      雪花算法的核心思想是将一个64位的ID分成多个部分,每个部分表示不同的信息。具体来说,一个雪花ID由以下几个部分组成:

         0. 初始位:占一位,默认位0。二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0

  1. 时间戳:占用41位,表示生成ID的时间戳,精确到毫秒级别。这样可以保证在同一毫秒内生成的ID是唯一的。

  2. 机器ID:占用10位,表示生成ID的机器的唯一标识。在分布式系统中,每台机器都需要有一个唯一的标识,以防止生成重复的ID。

  3. 序列号:占用12位,表示同一毫秒内生成的多个ID的序列号。当同一毫秒内生成的ID超过4096个时,序列号会从0开始重新计数。

         

     通过将时间戳、机器ID和序列号组合起来,就可以生成一个全局唯一的ID。

     优点:生成的ID有序、趋势递增,并且在分布式系统中具有较高的性能和可靠性。

     缺点:雪花算法并不是绝对的全局唯一,因为机器ID需要保证唯一性,而且系统时钟需要保证准确性。如果机器ID重复或者系统时钟回拨,都有可能导致生成重复的ID。

因此,在使用雪花算法时,需要确保机器ID的唯一性,并且对系统时钟进行合理的同步和校准。

三、Hutool实现雪花算法的方式:

 1.pom文件

<dependency>
   <groupId>cn.hutool</groupId>
   <artifactId>hutool-all</artifactId>
   <version>5.8.16</version>
</dependency>

2.代码实现:

public class SnowFlakeUtil {

    public static void main(String[] args) {
        //参数1:workerId 终端ID
        //参数2:dataCenterId 数据中心id
        Snowflake snowflake = IdUtil.createSnowflake(1,1);
        long id = snowflake.nextId();
        System.out.println("雪花算法1(每次生成一个新对象)实现:"+id);

        Snowflake secondSnow = IdUtil.getSnowflake(1,1);
        String secondId = secondSnow.nextIdStr();
        System.out.println("单例雪花算法2实现:"+secondId);

        //注:该方法只能在最新版本5.8.16版本
        long threeSnow = IdUtil.getSnowflakeNextId();
        System.out.println("单例雪花算法3实现(5.8.16版本):"+threeSnow);
    }
}

四、源码翻看:

版本:5.8.16

1. 创建雪花算法的基础方法:

 

createSnowflake(long workerId, long datacenterId) 方法,是每次调用都会创建一个新的Snowflake对象,不同的Snowflake对象创建的ID可能会有重复
getSnowflake() 系列方法,是单例的,是推荐方法

2.getSnowflakeNextId() 和 getSnowflakeNextStr(),这两个是新版本增加的方法,默认调用的是getSnowflake()方法,生成id

 

ps:发现了一个解决雪花算法重复问题的解决方案,只是做个记录,具体还得看实际。笔者认为参考博客的解决思路很好,下面是链接

参考连接:(84条消息) 线上使用雪花算法生成id重复问题_snowflake算法出现id重复_Dongguo丶的博客-CSDN博客

posted on 2023-06-29 16:48  C碧水蓝天S  阅读(13707)  评论(0编辑  收藏  举报