魔改雪花ID,1秒生成5000万个,支持时钟回拨、手动初始化、配置文件初始化(1)

High performance snowflake ID generator 高性能雪花ID生成器

点击查看第二篇

项目地址

Github源码
Gitee源码

Github测试
Gitee测试

SpringBoot自动配置项目地址

Github源码
Gitee源码

Github测试
Gitee测试

简介

本项目重构的Twitter的雪花ID生成器,并加上了手动设置参数、时钟回拨处理,以及支持SpringBoot自动配置。

依赖导入

最新版本

maven

<!-- 必须依赖 -->
<dependency>
    <groupId>cn.404z</groupId>
    <artifactId>id</artifactId>
    <version>2.1.0</version>
</dependency>
<!-- 额外依赖(运行未报错,不需要加) -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

gradle

// 必须依赖
implementation 'cn.404z:id:2.1.0'
// 额外依赖(运行未报错,不需要加)
implementation 'org.slf4j:slf4j-api:1.7.30'
implementation 'ch.qos.logback:logback-core:1.2.3'
implementation 'ch.qos.logback:logback-classic:1.2.3'

使用方法

直接调用

代码

System.out.println("ID为:" + Id.next());

结果

[main] INFO cn.z.id.Id - 预初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为12
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为4096,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为278年,失效日期为2299-09-27 23:10:22.207
ID为:5483442415337472

手动初始化

代码

Id.init(0, 8, 14);
System.out.println("ID为:" + Id.next());

结果

[main] INFO cn.z.id.Id - 预初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为12
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为4096,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为278年,失效日期为2299-09-27 23:10:22.207
[main] INFO cn.z.id.Id - 手动初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为14
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为16384,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为69年,失效日期为2090-09-07 23:47:35.551
ID为:21934128022683648

异常处理

初始化多次

代码

Id.init(0, 8, 13);
Id.init(0, 8, 15);
System.out.println("ID为:" + Id.next());

结果

[main] INFO cn.z.id.Id - 预初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为12
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为4096,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为278年,失效日期为2299-09-27 23:10:22.207
[main] INFO cn.z.id.Id - 手动初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为13
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为8192,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为139年,失效日期为2160-05-15 15:35:11.103
[main] WARN cn.z.id.Id - 已经初始化过了,不可重复初始化!
ID为:10967292061941760

初始化晚了

代码

System.out.println("ID为:" + Id.next());
Id.init(0, 8, 12);
System.out.println("ID为:" + Id.next());

结果

[main] INFO cn.z.id.Id - 预初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为12
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为4096,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为278年,失效日期为2299-09-27 23:10:22.207
[main] WARN cn.z.id.Id - 已经初始化过了,不可重复初始化!
ID为:5483684734959616
ID为:5483684734959617

初始化异常

代码

Id.init(1000, 8, 12);
System.out.println("ID为:" + Id.next());

结果

[main] INFO cn.z.id.Id - 预初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为12
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为4096,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为278年,失效日期为2299-09-27 23:10:22.207
[main] INFO cn.z.id.Id - 手动初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为1000,MACHINE_BITS为8,SEQUENCE_BITS为12
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为4096,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为278年,失效日期为2299-09-27 23:10:22.207
[main] ERROR cn.z.id.Id - 机器码MACHINE_ID需要>=0并且<=255。当前为1000
java.lang.Exception: 机器码无效
[main] ERROR cn.z.id.Id - 重置初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为12
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为4096,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为278年,失效日期为2299-09-27 23:10:22.207
ID为:5483719912587264

阻塞

代码

// 初始化,复现阻塞
Id.init(0, 0, 0);
System.out.println("ID为:" + Id.next());
System.out.println("ID为:" + Id.next());
System.out.println("ID为:" + Id.next());
System.out.println("ID为:" + Id.next());

结果

[main] INFO cn.z.id.Id - 预初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为12
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为4096,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为278年,失效日期为2299-09-27 23:10:22.207
[main] INFO cn.z.id.Id - 手动初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为0,SEQUENCE_BITS为0
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为0,1ms内最多生成Id数量为1,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为292471208年,失效日期为292269004-12-03 00:47:04.191
[main] WARN cn.z.id.Id - 检测到阻塞,时间为2021-03-02 20:44:07.469,最大序列号为0
[main] WARN cn.z.id.Id - 检测到阻塞,时间为2021-03-02 20:44:07.485,最大序列号为0
ID为:5229847469
ID为:5229847485
ID为:5229847500
[main] WARN cn.z.id.Id - 检测到阻塞,时间为2021-03-02 20:44:07.5,最大序列号为0
ID为:5229847516

时钟回拨(需要在1分钟内手动回拨时钟)

代码

for (int i = 0; i < 60; i++) {
    System.out.println("ID为:" + Id.next());
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

结果

[main] INFO cn.z.id.Id - 预初始化...
[main] INFO cn.z.id.Id - 初始化,MACHINE_ID为0,MACHINE_BITS为8,SEQUENCE_BITS为12
[main] INFO cn.z.id.Id - 最大机器码MACHINE_ID为255,1ms内最多生成Id数量为4096,时钟最早回拨到2021-01-01 08:00:00.0,可使用时间大约为278年,失效日期为2299-09-27 23:10:22.207
ID为:5483989976481792
[main] WARN cn.z.id.Id - 监测到系统时钟发生了回拨。回拨时间为2021-03-02 19:45:33.249,上一个生成的时间为2021-03-02 20:45:40.392
ID为:5483989977530368

性能比较

次数random.nextLong()耗时Id.next()耗时UUID.randomUUID()耗时倍数
100万15毫秒47毫秒1175毫秒25.0倍
1000万173毫秒227毫秒8853毫秒39.0倍
1亿793毫秒909毫秒83628毫秒92.0倍
21亿36886毫秒37871毫秒7915039毫秒209.0倍

许可证

BSD

交流

QQ:1416978277
微信:1416978277
支付宝:1416978277@qq.com
交流

赞助

赞助

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值