Skip to content

Commit

Permalink
v3.2.0.single 单机版正式发布
Browse files Browse the repository at this point in the history
  • Loading branch information
ALI1416 committed Mar 8, 2024
1 parent 2bdc152 commit 8408378
Show file tree
Hide file tree
Showing 6 changed files with 182 additions and 287 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ name: Java CI

on:
push:
branches: [ "master" ]
branches: [ "single" ]
paths-ignore:
- '**.md'
pull_request:
branches: [ "master" ]
branches: [ "single" ]
paths-ignore:
- '**.md'
workflow_dispatch:
Expand Down
46 changes: 2 additions & 44 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,5 @@
# 更新日志

## v3.2.0 `2023.02.29`
## v3.2.0.single `2024.03.08`

- 新增方法
- 自动重置开始时间戳

## v3.1.1 `2023.12.26`

- 新增方法

## v3.1.0 `2023.12.23`

- 新增方法

## v3.0.0 `2023.9.26`

- 工具类迁移到主类

## v2.8.0 `2023.8.31`

- 解决低频率下使用带来的偶数问题

## v2.7.0 `2023.7.27`

- 代码优化
- 新增异常类

## v2.6.0 `2023.6.12`

- 版本升级

## v2.5.0 `2023.3.22`

- 版本升级

## v2.4.0 `2022.4.8`

- 新增工具类

## v2.3.0 `2023.9.18`

- 新增重置初始时间戳方法

## v2.2.0 `2021.9.17`

- 使用父模板
- 单机版正式发布
129 changes: 66 additions & 63 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# High Performance Snowflake ID Generator 高性能雪花ID生成器
# High Performance Snowflake ID Generator (Single Version) 高性能雪花ID生成器(单机版)

[![License](https://img.shields.io/github/license/ALI1416/id?label=License)](https://www.apache.org/licenses/LICENSE-2.0.txt)
[![Java Support](https://img.shields.io/badge/Java-8+-green)](https://openjdk.org/)
Expand Down Expand Up @@ -27,7 +27,7 @@
<dependency>
<groupId>cn.404z</groupId>
<artifactId>id</artifactId>
<version>3.2.0</version>
<version>3.2.0.single</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
Expand All @@ -42,73 +42,74 @@

```java
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 90441966306721793
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:序列号位数SEQUENCE_BITS 20 ;1ms最多生成ID 1048576 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 105306160215621632
```

### 手动初始化

```java
Id.init(0, 8, 14);
Id.init(22);
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 14 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 16384 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2090-09-07 23:47:35.551 ,大约可使用 69 年
// INFO cn.z.id.IdTest -- ID 361768291288481792
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:序列号位数SEQUENCE_BITS 20 ;1ms最多生成ID 1048576 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:序列号位数SEQUENCE_BITS 22 ;1ms最多生成ID 4194304 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2090-09-07 23:47:35.551 ,大约可使用 69 年
// INFO cn.z.id.IdTest -- ID 421225011492159488
```

## 异常处理

### 初始化多次

```java
Id.init(0, 8, 13);
Id.init(0, 8, 15);
Id.init(21);
Id.init(22);
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 13 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 8192 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2160-05-15 15:35:11.103 ,大约可使用 139 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:序列号位数SEQUENCE_BITS 20 ;1ms最多生成ID 1048576 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:序列号位数SEQUENCE_BITS 21 ;1ms最多生成ID 2097152 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2160-05-15 15:35:11.103 ,大约可使用 139 年
// WARN cn.z.id.Id -- 已经初始化过了,不可重复初始化!
// INFO cn.z.id.IdTest -- ID 180884221449994241
// INFO cn.z.id.IdTest -- ID 210612668099198977
```

### 初始化晚了

```java
log.info("ID {}", Id.next());
Id.init(0, 8, 12);
Id.init(22);
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 90442134147039232
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:序列号位数SEQUENCE_BITS 20 ;1ms最多生成ID 1048576 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 105306373240127489
// WARN cn.z.id.Id -- 已经初始化过了,不可重复初始化!
// INFO cn.z.id.IdTest -- ID 90442134147039233
// INFO cn.z.id.IdTest -- ID 105306373240127490
```

### 初始化异常

```java
Id.init(1000, 8, 12);
Id.init(100);
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 1000 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// cn.z.id.IdException: 机器码MACHINE_ID 1000 无效!应为 [0,255]
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:序列号位数SEQUENCE_BITS 20 ;1ms最多生成ID 1048576 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:序列号位数SEQUENCE_BITS 100 ;1ms最多生成ID 68719476736 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2021-01-02 21:16:57.727 ,大约可使用 0 年
// ERROR cn.z.id.Id -- 当前时间 2024-03-08 16:39:58.921 无效!应为 [1970-01-01 08:00:00.0,2021-01-02 21:16:57.727]
// cn.z.id.IdException: 序列号位数SEQUENCE_BITS 100 无效!应为 [0,64]
```

### 阻塞

```java
// 使用较小的序列号位数初始化,可以复现阻塞
Id.init(0, 0, 1);
Id.init(1);
log.info("ID {}", Id.next());
log.info("ID {}", Id.next());
log.info("ID {}", Id.next());
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 0 ,序列号位数SEQUENCE_BITS 1 ,最大机器码MACHINE_ID 0 ;1ms最多生成ID 2 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 146140533-04-25 23:36:27.903 ,大约可使用 146235604 年
// INFO cn.z.id.IdTest -- ID 172504939970
// INFO cn.z.id.IdTest -- ID 172504939971
// WARN cn.z.id.Id -- 检测到阻塞,时间 2023-09-26 15:01:09.985 ,最大序列号 1
// INFO cn.z.id.IdTest -- ID 172504939981
// WARN cn.z.id.Id -- 检测到阻塞,时间 2023-09-26 15:01:09.99 ,最大序列号 1
// INFO cn.z.id.IdTest -- ID 172504940012
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:序列号位数SEQUENCE_BITS 20 ;1ms最多生成ID 1048576 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:序列号位数SEQUENCE_BITS 1 ;1ms最多生成ID 2 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 146140533-04-25 23:36:27.903 ,大约可使用 146235604 年
// INFO cn.z.id.IdTest -- ID 200856138949
// WARN cn.z.id.Id -- 检测到阻塞,时间 2024-03-08 16:41:09.474 ,最大序列号 1
// INFO cn.z.id.IdTest -- ID 200856138974
// INFO cn.z.id.IdTest -- ID 200856138975
// WARN cn.z.id.Id -- 检测到阻塞,时间 2024-03-08 16:41:09.487 ,最大序列号 1
// INFO cn.z.id.IdTest -- ID 200856139004
```

### 时钟回拨(需要在1分钟内手动回拨时钟)
Expand All @@ -122,12 +123,12 @@ for (int i = 0; i < 60; i++) {
Thread.currentThread().interrupt();
}
}
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 90442379897602049
// INFO cn.z.id.IdTest -- ID 90442380959809536
// WARN cn.z.id.Id -- 监测到系统时钟发生了回拨。回拨时间 2023-09-26 14:02:32.663 ,上一个生成的时间 2023-09-26 15:02:55.836
// INFO cn.z.id.IdTest -- ID 90442380960858113
// INFO cn.z.id.IdTest -- ID 90442382019919872
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:序列号位数SEQUENCE_BITS 20 ;1ms最多生成ID 1048576 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 105306532567056385
// INFO cn.z.id.IdTest -- ID 105306543069593601
// WARN cn.z.id.Id -- 监测到系统时钟发生了回拨。回拨时间 2024-03-08 16:40:25.247 ,上一个生成的时间 2024-03-08 16:42:25.475
// INFO cn.z.id.IdTest -- ID 105306543070642177
// INFO cn.z.id.IdTest -- ID 105306553560596480
```

### 重置初始时间戳(需要在1分钟内手动回拨时钟)
Expand All @@ -140,69 +141,71 @@ for (int i = 0; i < 60; i++) {
} catch (Exception ignore) {
Thread.currentThread().interrupt();
}
log.info("总共回拨时间为:{}毫秒", Id.reset());
log.info("ID {}", Id.next());
log.info("时钟正拨时间为:{}毫秒", Id.reset());
}
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 90442426204815360
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:序列号位数SEQUENCE_BITS 20 ;1ms最多生成ID 1048576 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 105307024018898945
// INFO cn.z.id.IdTest -- ID 105307025071669248
// INFO cn.z.id.Id -- 重置开始时间戳,时钟正拨 0 毫秒
// INFO cn.z.id.IdTest -- 时钟正拨时间为:0毫秒
// WARN cn.z.id.Id -- 监测到系统时钟发生了回拨。回拨时间 2023-09-26 14:03:30.023 ,上一个生成的时间 2023-09-26 15:03:38.985
// INFO cn.z.id.IdTest -- ID 90442426205863936
// INFO cn.z.id.Id -- 重置开始时间戳,时钟正拨 3608963 毫秒
// INFO cn.z.id.IdTest -- 时钟正拨时间为:3608963毫秒
// WARN cn.z.id.Id -- 监测到系统时钟发生了回拨。回拨时间 2024-03-08 16:48:06.833 ,上一个生成的时间 2024-03-08 16:50:08.157
// INFO cn.z.id.IdTest -- ID 105307028227883009
// INFO cn.z.id.Id -- 重置开始时间戳,时钟正拨 121325 毫秒
// INFO cn.z.id.IdTest -- 时钟正拨时间为:121325毫秒
```

## 工具

```java
Id.init(3, 4, 5);
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 3 ,机器码位数MACHINE_BITS 4 ,序列号位数SEQUENCE_BITS 5 ,最大机器码MACHINE_ID 15 ;1ms最多生成ID 32 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 572874-07-26 01:58:01.983 ,大约可使用 571232
Id.init(5);
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:序列号位数SEQUENCE_BITS 20 ;1ms最多生成ID 1048576 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:序列号位数SEQUENCE_BITS 5 ;1ms最多生成ID 32 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 9135678-01-08 07:28:31.743 ,大约可使用 9139725

/* 获取配置参数 */
log.info(Arrays.toString(Id.param()));
// INFO cn.z.id.IdTest -- [3, 4, 5]
log.info(String.valueOf(Id.param()));
// INFO cn.z.id.IdTest -- 5
long id = Id.next();
log.info(String.valueOf(id));
// INFO cn.z.id.IdTest -- 44161594381921
// INFO cn.z.id.IdTest -- 3213748448577

/* 根据配置参数解析id */
long[] parse = Id.parse(id);
log.info(Arrays.toString(parse));
// INFO cn.z.id.IdTest -- [1695712314027, 3, 1]
// INFO cn.z.id.IdTest -- [1709888839018, 1]

/* 根据配置参数构造id(序列号为0) */
log.info(String.valueOf(Id.format(parse[0])));
// INFO cn.z.id.IdTest -- 44161594381920
// INFO cn.z.id.IdTest -- 3213748448576

/* 根据配置参数构造id */
log.info(String.valueOf(Id.format(parse[0], 1L)));
// INFO cn.z.id.IdTest -- 44161594381921
// INFO cn.z.id.IdTest -- 3213748448577

/* 解析id */
long[] parse2 = Id.parse(8L, 12L, id);
long[] parse2 = Id.parse(20L, id);
log.info(Arrays.toString(parse2));
// INFO cn.z.id.IdTest -- [1609501315778, 85, 1633]
// INFO cn.z.id.IdTest -- [1609462264869, 372033]

/* 构造id */
log.info(String.valueOf(Id.format(parse2[1], 8L, 12L, parse2[0], parse2[2])));
// INFO cn.z.id.IdTest -- 44161594381921
log.info(String.valueOf(Id.format(20L, parse2[0], parse2[1])));
// INFO cn.z.id.IdTest -- 3213748448577

/* 获取id的时间戳 */
log.info(String.valueOf(Id.newTimestamp(id)));
// INFO cn.z.id.IdTest -- 2023-12-23 15:13:04.144
// INFO cn.z.id.IdTest -- 2024-03-08 17:07:19.018
```

更多请见[测试](./src/test)

## 性能比较

| 次数 | 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倍 |
| 次数 | random.nextLong()耗时 | Id.next()耗时 | UUID.randomUUID()耗时 | 倍数 |
| ------ |---------------------|-------------|---------------------|----------|
| 100万 | 16毫秒 | 31毫秒 | 1184毫秒 | 74.0倍 |
| 1000万 | 96毫秒 | 191毫秒 | 8926毫秒 | 93.0倍 |
| 1亿 | 830毫秒 | 793毫秒 | 83830毫秒 | 101.0倍 |
| 21亿 | 1991毫秒 | 36886毫秒 | 7916216毫秒 | 3976.0倍 |

## 更新日志

Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>

<artifactId>id</artifactId>
<version>3.2.0</version>
<version>3.2.0.single</version>

<parent>
<groupId>cn.404z</groupId>
Expand All @@ -14,7 +14,7 @@
</parent>

<name>id</name>
<description>High Performance Snowflake ID Generator 高性能雪花ID生成器</description>
<description>High Performance Snowflake ID Generator (Single Version) 高性能雪花ID生成器(单机版)</description>
<url>https://github.com/ALI1416/id</url>

<scm>
Expand Down

0 comments on commit 8408378

Please sign in to comment.