# 雪花算法中非常好用的数字ID生成器
## 💎 最佳实践(置顶)
针对大家在使用中经常出现的性能疑问,我给出以下3组最佳实践:
❄ 如果ID生成需求不超过5W个/s,不用修改任何配置参数
❄ 如果超过5W个/s,低于50W个/s,推荐修改:SeqBitLength=10
❄ 如果超过50W个/s,接近500W个/s,推荐修改:SeqBitLength=12
总之,增加 SeqBitLength 会让性能更高,但生成的 ID 会更长。
## 💎 算法介绍
❄ 这是优化的雪花算法(雪花漂移),它生成的ID更短、速度更快。
❄ 支持 k8s 等容器环境自动扩容(自动注册 WorkerId),可在单机或分布式环境生成数字型唯一ID。
❄ 原生支持 C#/Java/Go/C/Rust/Python/Node.js/PHP(C扩展)/SQL/ 等语言,并提供多线程安全调用动态库(FFI)。
❄ 兼容所有雪花算法(号段模式或经典模式,大厂或小厂),将来你可做任意的升级切换。
❄ 这是计算机历史上最全面的雪花ID生成工具。【截至2022年8月】
#### 需求来源
💧 作为架构设计的你,想要解决数据库主键唯一的问题,特别是在分布式系统多数据库中。
💧 你希望数据表主键用最少的存储空间,索引速度更快,Select、Insert 和 Update 更迅速。
💧 你要考虑在分库分表(合库合表)时,主键值可直接使用,并能反映业务时序。
💧 如果这样的主键值太长,超过前端 js Number 类型最大值,须把 Long 型转换为 String 型,你会觉得有点沮丧。
💧 尽管 Guid 能自增,但占用空间大,索引速度慢,你不想用它。
💧 应用实例可能超过50个,每个并发请求可达10W/s。
💧 要在容器环境部署应用,支持水平复制、自动扩容。
💧 不想依赖 redis 的自增操作获得连续的主键ID,因为连续的ID存在业务数据安全风险。
💧 你希望系统运行 100 年以上。
#### 传统算法问题
❌ 生成的ID太长。
❌ 瞬时并发量不够。
❌ 不能解决时间回拨问题。
❌ 不支持后补生成前序ID。
❌ 可能依赖外部存储系统。
#### 新算法特点
✔ 整形数字,随时间单调递增(不一定连续),长度更短,用50年都不会超过 js Number类型最大值。(默认配置)
✔ 速度更快,是传统雪花算法的2-5倍,0.1秒可生成50万个(基于8代低压i7)。
✔ 支持时间回拨处理。比如服务器时间回拨1秒,本算法能自动适应生成临界时间的唯一ID。
✔ 支持手工插入新ID。当业务需要在历史时间生成新ID时,用本算法的预留位能生成5000个每秒。
✔ 不依赖任何外部缓存和数据库。(k8s环境下自动注册 WorkerId 的动态库依赖 redis)
✔ 基础功能,开箱即用,无需配置文件、数据库连接等。
#### 性能数据
(参数:10位自增序列,1000次漂移最大值)
| 连续请求量 | 5K | 5W | 50W |
| ---- | ---- | ---- | ---- |
| 传统雪花算法 | 0.0045s | 0.053s | 0.556s |
| 雪花漂移算法 | 0.0015s | 0.012s | 0.113s |
💍 极致性能:500W/s~3000W/s。(所有测试数据均基于8代低压i7计算)
#### 如何处理时间回拨
🔶 当发生系统时间回拨时,算法采用过去时序的预留序数生成新的ID。
🔶 回拨生成的ID序号,默认靠前,也可以调整为靠后。
🔶 允许时间回拨至本算法预设基数(参数可调)。
## 💎 ID组成说明
* 本算法生成的ID由3部分组成(沿用雪花算法定义):
* +-------------------------+--------------+----------+
* | 1.相对基础时间的时间差 | 2.WorkerId | 3.序列数 |
* +-------------------------+--------------+----------+
*
* 第1部分,时间差,是生成ID时的系统时间减去 BaseTime 的总时间差(毫秒单位)。
* 第2部分,WorkerId,是区分不同机器或不同应用的唯一ID,最大值由 WorkerIdBitLength(默认6)限定。
* 第3部分,序列数,是每毫秒下的序列数,由参数中的 SeqBitLength(默认6)限定。
#### ID示例
🟣 本算法生成的 ID ,是整数(占用空间最多8字节),以下是基于默认配置生成的ID:
```
129053495681099 (运行1年,长度:15)
387750301904971 (运行3年,长度:15)
646093214093387 (运行5年,长度:15)
1292658282840139 (运行10年,长度:16)
9007199254740992 (运行70年,达到 js Number 最大值,长度:16)
165399880288699493 (运行1000年,等同普通雪花算法运行1年,长度:18)
```
🟣 本算法生成的 ID 值,是 js Number 最大值的 1%-10%,是普通雪花算法值的千分之一,而生成速度却超过普通雪花算法。
🟣 js Number 类型最大数值:9007199254740992,本算法在保持并发性能(5W+/0.01s)和最大64个 WorkerId(6bit)的同时,能用70年才到 js Number Max 值。
### 长度估算
```
💍 每增加 1位 WorkerIdBitLength 或 SeqBitLength,生成的ID数字值将会乘以2(基础长度可参考前一节“ID示例”),反之则除以2。
```
### 能用多久
能用多久的解释,是指生成的ID数字,何时能增长到超过 long(有符号64位,8字节)最大值。
🔵 在默认配置下,ID可用 71000 年不重复。
🔵 在支持 1024 个工作节点时,ID可用 4480 年不重复。
🔵 在支持 4096 个工作节点时,ID可用 1120 年不重复。
## 💎 参数设置
❄ ***WorkerIdBitLength***,机器码位长,决定 WorkerId 的最大值,**默认值6**,取值范围 [1, 19],实际上有些语言采用 无符号 ushort (uint16) 类型接收该参数,所以最大值是16,如果是采用 有符号 short (int16),则最大值为15。
❄ **WorkerId**,机器码,**最重要参数**,无默认值,必须 **全局唯一**(或相同 DataCenterId 内唯一),必须 **程序设定**,缺省条件(WorkerIdBitLength取默认值)时最大值63,理论最大值 2^WorkerIdBitLength-1(不同实现语言可能会限定在 65535 或 32767,原理同 WorkerIdBitLength 规则)。不同机器或不同应用实例 **不能相同**,你可通过应用程序配置该值,也可通过调用外部服务获取值。针对自动注册WorkerId需求,本算法提供默认实现:通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。
**特别提示**:如果一台服务器部署多个独立服务,需要为每个服务指定不同的 WorkerId。
❄ ***SeqBitLength***,序列数位长,**默认值6**,取值范围 [3, 21](建议不小于4),决定每毫秒基础生成的ID个数。如果每秒请求数不超过5W,保持默认值6即可;如果超过5W,不超过50W,建议赋值10或更大,以此类推。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。
❄ ***MinSeqNumber***,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。
❄ ***MaxSeqNumber***,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,真实最大序列数取最大值(2^SeqBitLength-1),不为0时,取其为真实最大序列数,一般无需设置,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。
❄ ***BaseTime***,基础时间(也称:基点时间、原点时间、纪元时间),有默认值(2020年),是毫秒时间戳(是整数,.NET是DatetTime类型),作用是:用生成ID时的系统时间与基础时间的差值(毫秒数)作为生成ID的时间戳。基础时间一般无需设置,如果觉得默认值太老,你可以重新设置,不过要注意,这个值以后最好不变。
第二版计划增加参数:
❄ ***DataCenterId***,数�
没有合适的资源?快使用搜索试试~ 我知道了~
迄今为止最全面的分布式主键ID生成器优化的雪花算法(SnowFlake)雪花漂移算法在缩短ID长度的同时具备高瞬时并发处理能力
共206个文件
md:20个
d:14个
java:13个
0 下载量 114 浏览量
2024-04-03
10:30:09
上传
评论
收藏 1.38MB ZIP 举报
温馨提示
kmp算法。迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 Python、Node.js、Ruby 多线程安全调用动态库(FFI)。支持容器环境自动扩容(自动注册 WorkerId ),单机或分布式唯一IdGenerator。 这是优化的雪花算法(雪花漂移),它生成的ID更短、速度更快。支持 k8s 等容器环境自动扩容(自动注册 WorkerId),可在单机或分布式环境生成数字型唯一ID。 原生支持 C#/Java/Go/C/Rust/Python/Node.js/PHP(C扩展)/SQL/ 等语言,并提供多线程安全调用动态库(FFI)。兼容所有雪花算法(号段模式或经典模式,大厂或小厂),将来你可做任意的升级切换。这是计算机历史上最全面的雪花ID生成工具。速度更快,是传统雪花算法的2-5倍,0.1秒可生成50万个(基于8代低压i7)。支持时间回拨处理。比如服务器时间回拨1秒,本算法能自
资源推荐
资源详情
资源评论
收起资源包目录
迄今为止最全面的分布式主键ID生成器优化的雪花算法(SnowFlake)雪花漂移算法在缩短ID长度的同时具备高瞬时并发处理能力 (206个子文件)
yitidgen-linux-x64.7z 600KB
yitidgen-win-x64.7z 57KB
build-release.bat 98B
BakClear.bat 39B
snowdrift.c 8KB
snowflake.c 8KB
SnowWorkerM1.c 6KB
IdGenerator.c 4KB
test.c 2KB
main.c 2KB
shm.c 1KB
SnowWorkerM2.c 1KB
IdGenOptions.c 950B
spinlock.c 931B
YitIdHelper.c 651B
main.cpp 2KB
CREDITS 25B
SnowWorkerM1.cs 11KB
Program.cs 9KB
DefaultIdGenerator.cs 4KB
IdGeneratorOptions.cs 3KB
SnowWorkerM3.cs 3KB
YitIdHelper.cs 2KB
OverCostActionArg.cs 2KB
SnowWorkerM2.cs 2KB
GenTest.cs 1KB
IIdGenerator.cs 775B
ISnowWorker.cs 603B
Yitter.IdGenerator.csproj 1KB
Yitter.IdGenTest.csproj 753B
DateTimeHelper.d 7KB
SnowWorkerM1.d 6KB
DefaultIdGenerator.d 3KB
IdGeneratorOptions.d 2KB
SnowWorkerM2.d 1KB
app.d 1KB
YitIdHelper.d 1KB
OverCostActionArg.d 1KB
GenTest.d 870B
IdGeneratorException.d 553B
package.d 262B
IIdGenerator.d 197B
ISnowWorker.d 194B
package.d 177B
uTest.dfm 2KB
IdGenTest.dpr 742B
IdGenTest.dproj 52KB
EXPERIMENTAL 0B
.gitignore 4KB
.gitignore 4KB
.gitignore 4KB
.gitignore 4KB
.gitignore 4KB
.gitignore 4KB
.gitignore 417B
.gitignore 316B
.gitignore 81B
.gitignore 52B
.gitignore 45B
.gitignore 44B
reghelper.go 11KB
SnowWorkerM1.go 6KB
main.go 4KB
DefaultIdGenerator.go 3KB
IdGeneratorOptions.go 2KB
main.go 1KB
SnowWorkerM2.go 1KB
YitIdHelper.go 886B
OverCostActionArg.go 768B
IdGeneratorException.go 355B
IIdGenerator.go 221B
ISnowWorker.go 218B
reg.go 30B
IdGenerator.h 15KB
workeridgo.h 3KB
php_snowdrift.h 2KB
IdGenOptions.h 1KB
SnowWorkerM1.h 1KB
snowflake.h 660B
IdGenerator.h 517B
spinlock.h 492B
YitIdHelper.h 477B
SnowWorkerM2.h 288B
common.h 259B
shm.h 156B
SnowWorkerM1.java 7KB
DefaultIdGenerator.java 3KB
StartUpJmh.java 2KB
StartUpJmh2.java 2KB
IdGeneratorOptions.java 2KB
StartUp.java 2KB
YitIdHelper.java 1KB
SnowWorkerM2.java 1KB
OverCostActionArg.java 1KB
GenTest.java 858B
IdGeneratorException.java 653B
IIdGenerator.java 232B
ISnowWorker.java 230B
regprocess.jpg 156KB
regprocess.jpg 156KB
共 206 条
- 1
- 2
- 3
资源评论
传奇开心果编程
- 粉丝: 8085
- 资源: 335
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现图像处理,本程序使用背景差分法对来往车辆进行检测和跟踪.rar
- 基于matlab实现视频监控中车型识别代码,自己写的,希望和大家多多交流.rar
- sdk.config
- 基于matlab实现配电网三相潮流计算方法,对几种常用的配电网潮流计算方法进行了对比分析.rar
- 基于matlab实现配电网潮流 经典33节点 前推回代法潮流计算 回代电流 前推电压 带注释.rar
- 基于matlab实现模拟退火遗传算法的车辆调度问题研究,用MATLAB语言加以实现.rar
- 基于matlab实现蒙特卡洛的的移动传感器节点定位算法仿真代码.rar
- 华中数控系统818用户说明书
- 基于matlab实现卡尔曼滤波器完成多传感器数据融合 对多个机器人的不同传感器数据进行融合估计足球精确位置.rar
- 基于matlab实现进行简单车辆识别-车辆检测.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功