详解Java中雪花算法的实现

 更新时间:2022年12月14日 14:24:27   作者:羲圣  
雪花算法是一种分布式的id生成算法。原理是将long分成若干个区段分别管理。本文将利用Java简单的实现雪花算法,感兴趣的可以了解一下

前言

本文主要介绍了Java雪花算法的实现

一、雪花算法

雪花算法是一种分布式的id生成算法。原理是将long分成若干个区段分别管理。默认包括时间戳、数据中心ID/机房ID,woker id(机器编号),以及sequence四个部分,用户可以自由扩展第五个部分type。 同时用户也可以动态调整这5个部分的占比关系。

二、使用步骤

1.引入库

1.1 编译并发布到本地

gradle clean build publishToMavenLocal-x test

1.2 gradle (gradle.org)

implementation'io.github.kylin-hunter:k-commons:1.0.7'

1.3 maven (maven.apache.org)

        <dependency>
          <groupId>io.github.kylin-hunter</groupId>
            <artifactId>io.github.kylin-hunter:k-commons</artifactId>
          <version>1.0.7</version>
        </dependency>

2.示例

2.1 主要Api

2.1.1 构造器

   /**
 * @param type 业务类型
 * @param workerId 机器编号
 * @param datacenterId 机房编号
 * @title UidGenerator 构造器
 * @description
 * @author BiJi'an
 * @date 2022-12-11 16:19
 */
public UidGenerator(long type,long workerId,long datacenterId);
/**
 * @param sequenceBits  序列号 占的bit位数
 * @param typeBits 业务类型 占的bit位数
 * @param workerIdBits 机器编号 占的bit位数
 * @param datacenterIdBits 机房编号 占的bit位数
 * @param type 业务类型
 * @param workerId 机器编号
 * @param datacenterId 机房编号
 * @title UidGenerator 构造器
 * @description
 * @author BiJi'an
 * @date 2022-12-11 16:20
 */
public UidGenerator(int sequenceBits,int typeBits,int workerIdBits,int datacenterIdBits,        long type,long workerId,        long datacenterId);

2.1.2 生成和反解uid

 /**
 * @return long
 * @title 获取下一个uid
 * @description
 * @author BiJi'an
 * @date 2022-12-11 00:39
 */
public synchronized long nextId();


/**
 * @param uid uid
 * @return io.github.kylinhunter.commons.uid.UidInfo
 * @title 通过uid 反解出uid的信息
 * @description
 * @author BiJi'an
 * @date 2022-12-11 16:30
 */
public UidInfo parse(long uid);

2.2代码示例

    // 业务代码 3,默认业务代码支持范围 0-15,可以通过构造器2调整支持范围
    // 机器编码 4,默认机器编码支持范围0-15,可以通过构造器2调整支持范围
    // 机房编码 1,默认机房支持范围 0-4,可以通过构造器2调整支持范围
    // 各个编码范围,均可以调整
        UidGenerator worker = new UidGenerator(3, 4, 1);
        for (int i = 0; i < 10; i++) {
          long nextId = worker.nextId();
          System.out.println(nextId + "=>" + worker.parse(nextId));
        }

2.3 结果输出

        2022-12-11 22:54:26.177 [Test worker] INFO   -  i.g.k.commons.uid.UidGenerator[107]: timestampBits 41,datacenterIdBits 2, workerIdBits 4,typeBits 4, sequenceBits 12
        161155503589961728=>UidInfo[sequence=0, type=3, workerId=4, datacenterId=1, timestamp=1670921666180/2022-12-13 16:54:26]
        161155503644487680=>UidInfo[sequence=0, type=3, workerId=4, datacenterId=1, timestamp=1670921666193/2022-12-13 16:54:26]
        161155503648681984=>UidInfo[sequence=0, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681985=>UidInfo[sequence=1, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681986=>UidInfo[sequence=2, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681987=>UidInfo[sequence=3, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681988=>UidInfo[sequence=4, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681989=>UidInfo[sequence=5, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681990=>UidInfo[sequence=6, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]
        161155503648681991=>UidInfo[sequence=7, type=3, workerId=4, datacenterId=1, timestamp=1670921666194/2022-12-13 16:54:26]

到此这篇关于详解Java中雪花算法的实现的文章就介绍到这了,更多相关Java雪花算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • netty中的IO、NIO、AIO使用详解

    netty中的IO、NIO、AIO使用详解

    这篇文章主要介绍了netty中的IO、NIO、AIO使用详解,本文会说明各种IO的特点、分别解决了什么样的问题做一个分析阐述,并结合Java代码例子来辅助理解,像这些的历史演进和详细的底层原理网上很多,所以我们只站在应用层,使用者的角度去分析,需要的朋友可以参考下
    2023-12-12
  • 解决for循环为空不需要判断的问题

    解决for循环为空不需要判断的问题

    这篇文章主要介绍了解决for循环为空不需要判断的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 谈谈变量命名规范的重要性

    谈谈变量命名规范的重要性

    下面小编就为大家带来一篇谈谈变量命名规范的重要性。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 使用Java代码获取服务器性能信息及局域网内主机名

    使用Java代码获取服务器性能信息及局域网内主机名

    这篇文章主要介绍了使用Java代码获取服务器性能信息及局域网内主机名的方法,方便对服务器的远程管理和团队协作时用到,而且文中的方法无需调用jni,需要的朋友可以参考下
    2015-11-11
  • SpringBoot项目找不到接口报404错误的解决办法

    SpringBoot项目找不到接口报404错误的解决办法

    写了一个简单的springboot项目,在启动的时候idea未报错,浏览器访问接口时报404的错误,所以本文给大家介绍了SpringBoot项目找不到接口报404错误的解决办法,文中有相关的图文供大家参考,需要的朋友可以参考下
    2024-12-12
  • java获取优酷视频地址示例

    java获取优酷视频地址示例

    使用JAVA解析优酷视频页,得到视频真实地址, 还可以下载,需要的朋友可以参考下
    2014-03-03
  • 详解Spring中的FactoryBean

    详解Spring中的FactoryBean

    本篇文章主要介绍了Spring中的FactoryBean,如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean
    2017-04-04
  • JPA添加Pageable实现翻页时报错的问题

    JPA添加Pageable实现翻页时报错的问题

    这篇文章主要介绍了解决JPA添加Pageable实现翻页时报错的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • springboot如何解决跨域后session获取不到sessionId不一致

    springboot如何解决跨域后session获取不到sessionId不一致

    这篇文章主要介绍了springboot如何解决跨域后session获取不到sessionId不一致问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • BootStrap Jstree 树形菜单的增删改查的实现源码

    BootStrap Jstree 树形菜单的增删改查的实现源码

    这篇文章主要介绍了BootStrap Jstree 树形菜单的增删改查的实现源码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02

最新评论