1
0
mirror of synced 2026-02-18 10:57:56 +08:00
Files
SnowFlake-IdGenerator/README.md
zhouzj 61e7743894 edit
2021-03-11 19:02:06 +08:00

169 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# IdGenerator
#### 介绍
用一种全新的雪花漂移算法让ID更短、生成速度更快。
核心在于缩短ID长度的同时还能保持每毫秒并发处理量50W/0.1s),且能保持伸缩能力。
## 功能说明
1.ID更短是传统算法的几倍用50年都不会超过jsNumber的最大值。默认配置WorkerId是6bit自增数是6bit
2.生成速度更快0.1秒可生成50万个。i7笔记本默认算法配置6bit+6bit
3.支持时间回拨处理。比如Linux服务器时间回拨1秒本算法能自动适应生成临界时间的唯一ID。
4.支持手工插入新ID。当业务需要在历史时间生成新ID时用本算法的预留位每秒能生成5000个。
5.漂移时对外异步发通知事件。让调用方确切知道算法漂移记录Log并发调用量。
6.不依赖任何外部缓存和数据库。但WorkerId必须由外部指定
7.目前是C#版很快会出java、php等版本。
## 文件说明
1.SnowWorkerM1.cs 是雪花漂移算法。
2.SnowWorkerM2.cs 是传统雪花算法。
## 效果
1.js Number 类型最大数值9007199254740992本算法在保持并发性能5W+/0.01s和最大64个WorkerId6bit的同时能用70年才到 js Number Max 值。
2.增加WorkerId位数到8bit128节点15年达到 js Number Max 值。
3.极致性能500W/1s。
4.所有测试数据均基于8代低压i7计算。
## 适用范围
1.小型、中型、大型需要全局唯一Id不用Guid的项目。
2.分布式项目。
3.不想将Long型转String给前端用的项目。如果前端支持bigint则不用考虑此项
## 大型分布式环境使用建议
1.可扩大 WorkerIdBitLength 到最多20位支持 1,048,576 个节点且不影响上述并发性能50W/0.1s)。
2.采用中心化 IdGenerator 集群,给节点生成可用 Id 列表,存入 Redis 队列供节点消费。此时64个中心化节点数足够大型互联网项目使用。
## 使用方法
#### 雪花漂移算法
```
var options = new IdGeneratorOptions()
{
// 设置WorkerId默认最大2^16-1
WorkerId = 1
};
var newId = new YitIdGenerator(options).NewLong();
```
#### 传统雪花算法
```
var options = new IdGeneratorOptions()
{
Method = 2, // 默认1
WorkerId = 1
};
var newId = new YitIdGenerator(options).NewLong();
```
## options说明
options参数Method、StartTime除外只支持漂移算法不支持传统雪花算法。
```
public class IdGeneratorOptions
{
/// <summary>
/// 雪花计算方法
/// 1|2
/// </summary>
public short Method { get; set; } = 1;
/// <summary>
/// 开始时间UTC格式
/// 不能超过当前系统时间
/// </summary>
public DateTime StartTime { get; set; } = DateTime.MinValue;
/// <summary>
/// 机器码
/// 与 WorkerIdBitLength 有关系
/// </summary>
public ushort WorkerId { get; set; } = 0;
/// <summary>
/// 机器码位长
/// 范围2-21要求序列数位长+机器码位长不超过22
/// 建议范围6-12。
/// </summary>
public byte WorkerIdBitLength { get; set; } = 6;//10;
/// <summary>
/// 序列数位长
/// 范围2-21要求序列数位长+机器码位长不超过22
/// 建议范围6-14。
/// </summary>
public byte SeqBitLength { get; set; } = 6;//10;
/// <summary>
/// 最大序列数(含)
/// 由SeqBitLength计算的最大值
/// </summary>
public int MaxSeqNumber { get; set; } = 0;
/// <summary>
/// 最小序列数(含)
/// 默认11不小于5不大于MaxSeqNumber-2
/// </summary>
public ushort MinSeqNumber { get; set; } = 11;
/// <summary>
/// 最大漂移次数(含),
/// 默认2000推荐范围500-10000与计算能力有关
/// </summary>
public int TopOverCostCount { get; set; } = 2000;
```
## 生成的ID示例
### 默认配置
```
WorkerId = 6 (最多64个工作节点)
SeqBitLength = 6
```
ID示例
```
129053495681099 (默认配置运行运行1年)
387750301904971 (默认配置运行运行3年)
646093214093387 (默认配置运行运行5年)
9007199254740992 (js Number 最大值)
```
### 能用多久
1.在默认配置下ID可用 71000 年不重复。
2.在支持 1024 个工作节点时ID可用 4480 年不重复。
3.在支持 4096 个工作节点时ID可用 1120 年不重复。
4.以上所有工作节点,均拥有 50W/0.1s 最大处理速度。
## 技术支持
开源地址https://gitee.com/yitter/idgenerator
QQ群646049993