README.md 4.9 KB
Newer Older
Z
edit  
zhouzj 已提交
1
# IdGenerator
Z
init  
zhouzj 已提交
2 3

#### 介绍
Z
edit  
zhouzj 已提交
4
用一种全新的雪花漂移算法,让ID更短、生成速度更快。
Z
edit  
zhouzj 已提交
5
核心在于缩短ID长度的同时,还能保持每毫秒并发处理量(50W/0.1s),且能保持伸缩能力。
Z
edit  
zhouzj 已提交
6

Z
edit  
zhouzj 已提交
7
## 功能说明
Z
edit  
zhouzj 已提交
8

Z
edit  
zhouzj 已提交
9
1.ID更短,是传统算法的几倍,用50年都不会超过js(Number)的最大值。(默认配置WorkerId是6bit,自增数是6bit)
Z
edit  
zhouzj 已提交
10

Z
edit  
zhouzj 已提交
11
2.生成速度更快,0.1秒可生成50万个。(i7笔记本,默认算法配置6bit+6bit)
Z
edit  
zhouzj 已提交
12

Z
edit  
zhouzj 已提交
13
3.支持时间回拨处理。比如Linux服务器时间回拨1秒,本算法能自动适应生成临界时间的唯一ID。
Z
edit  
zhouzj 已提交
14

Z
edit  
zhouzj 已提交
15
4.支持手工插入新ID。当业务需要在历史时间生成新ID时,用本算法的预留位每秒能生成5000个。
Z
edit  
zhouzj 已提交
16

Z
edit  
zhouzj 已提交
17
5.漂移时对外异步发通知事件。让调用方确切知道算法漂移记录,Log并发调用量。
Z
edit  
zhouzj 已提交
18

Z
edit  
zhouzj 已提交
19
6.不依赖任何外部缓存和数据库。(但WorkerId必须由外部指定)
Z
edit  
zhouzj 已提交
20 21 22 23

7.目前是C#版,很快会出java、php等版本。


Z
edit  
zhouzj 已提交
24
## 文件说明
Z
edit  
zhouzj 已提交
25 26 27 28

1.SnowWorkerM1.cs 是雪花漂移算法。

2.SnowWorkerM2.cs 是传统雪花算法。
Z
edit  
zhouzj 已提交
29

Z
edit  
zhouzj 已提交
30

Z
edit  
zhouzj 已提交
31
## 效果
Z
edit  
zhouzj 已提交
32

Z
edit  
zhouzj 已提交
33
1.js Number 类型最大数值:9007199254740992,本算法在保持并发性能(5W+/0.01s)和最大64个WorkerId(6bit)的同时,能用70年才到 js Number Max 值。
Z
edit  
zhouzj 已提交
34

Z
edit  
zhouzj 已提交
35
2.增加WorkerId位数到8bit(128节点)时,15年达到 js Number Max 值。
Z
edit  
zhouzj 已提交
36

Z
edit  
zhouzj 已提交
37 38
3.极致性能:500W/1s。

Z
edit  
zhouzj 已提交
39
4.所有测试数据均基于8代低压i7计算。
Z
edit  
zhouzj 已提交
40

Z
edit  
zhouzj 已提交
41

Z
edit  
zhouzj 已提交
42
## 适用范围
Z
edit  
zhouzj 已提交
43 44 45 46 47 48 49 50

1.小型、中型、大型需要全局唯一Id(不用Guid)的项目。

2.分布式项目。

3.不想将Long型转String给前端用的项目。(如果前端支持bigint,则不用考虑此项)


Z
edit  
zhouzj 已提交
51
##  大型分布式使用建议
Z
edit  
zhouzj 已提交
52

Z
edit  
zhouzj 已提交
53
1.可扩大 WorkerIdBitLength 到最多20位,支持 1,048,576 个节点,且不影响上述并发性能(50W/0.1s)。
Z
edit  
zhouzj 已提交
54

Z
edit  
zhouzj 已提交
55
2.采用中心化 IdGenerator 集群,给节点生成可用 Id 列表,存入 Redis 队列供节点消费。此时64个中心化节点数足够大型互联网项目使用。
Z
edit  
zhouzj 已提交
56

Z
edit  
zhouzj 已提交
57 58 59 60 61 62 63
## 如何处理时间回拨
1.当发生系统时间回拨的时候,算法采用过去时序的预留序数(0-5)生成新的ID。

2.默认每秒可生成100个(速度可调整)。

3.回拨生成的ID序号,默认靠前,也可以调整为靠后。

Z
edit  
zhouzj 已提交
64 65
4.允许时间回拨至本算法预设基数(参数可调,默认大于1年)。

Z
edit  
zhouzj 已提交
66

Z
edit  
zhouzj 已提交
67 68 69 70 71 72 73 74 75 76 77
## 能用多久

1.在默认配置下,ID可用 71000 年不重复。

2.在支持 1024 个工作节点时,ID可用 4480 年不重复。

3.在支持 4096 个工作节点时,ID可用 1120 年不重复。

4.以上所有工作节点,均拥有 50W/0.1s 最大处理速度。


Z
edit  
zhouzj 已提交
78
## 代理示例
Z
edit  
zhouzj 已提交
79

Z
edit  
zhouzj 已提交
80
#### 雪花漂移算法
Z
edit  
zhouzj 已提交
81 82 83
```
var options = new IdGeneratorOptions()
{
Z
edit  
zhouzj 已提交
84 85 86
	// 设置WorkerId,默认最大2^16-1
	WorkerId = 1
};
Z
edit  
zhouzj 已提交
87

Z
edit  
zhouzj 已提交
88
var newId = new YitIdGenerator(options).NewLong();
Z
edit  
zhouzj 已提交
89
```
Z
edit  
zhouzj 已提交
90

Z
edit  
zhouzj 已提交
91 92 93 94
#### 传统雪花算法
```
var options = new IdGeneratorOptions()
{
Z
edit  
zhouzj 已提交
95
	Method = 2,  // 默认1
Z
edit  
zhouzj 已提交
96
	WorkerId = 1
Z
edit  
zhouzj 已提交
97 98
};

Z
edit  
zhouzj 已提交
99
var newId = new YitIdGenerator(options).NewLong();
Z
edit  
zhouzj 已提交
100 101
```

Z
edit  
zhouzj 已提交
102 103 104
## options说明
options参数(Method、StartTime除外)只支持漂移算法,不支持传统雪花算法。

Z
edit  
zhouzj 已提交
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
```
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;
```
Z
edit  
zhouzj 已提交
158

Z
edit  
zhouzj 已提交
159
## 生成的ID
Z
edit  
zhouzj 已提交
160

Z
edit  
zhouzj 已提交
161
### 默认配置
Z
edit  
zhouzj 已提交
162
```
Z
edit  
zhouzj 已提交
163 164
WorkerId = 6	(最多64个工作节点)
SeqBitLength = 6
Z
edit  
zhouzj 已提交
165
```
Z
edit  
zhouzj 已提交
166

Z
edit  
zhouzj 已提交
167
ID示例:
Z
edit  
zhouzj 已提交
168
```
Z
edit  
zhouzj 已提交
169 170 171 172
129053495681099        (默认配置运行运行1年)
387750301904971        (默认配置运行运行3年)
646093214093387        (默认配置运行运行5年)
9007199254740992       (js Number 最大值)
Z
edit  
zhouzj 已提交
173 174
```

Z
edit  
zhouzj 已提交
175
## 技术支持
Z
edit  
zhouzj 已提交
176

Z
edit  
zhouzj 已提交
177
开源地址:https://gitee.com/yitter/idgenerator
Z
edit  
zhouzj 已提交
178

Z
edit  
zhouzj 已提交
179 180
QQ群:646049993