前言
这个讲解的比较多,很多文章都有提到,主要参考这两篇博客吧。回头总结一下这两篇文章。
Snowflake算法(雪花算法)
大概就是给每一个机器分配一个标识位,然后取时间戳、标识位、全局自增ID拼接成一起,比如时间戳是1000,机器标识位 2000,全局自增ID是1111,那我们得到的ID就是
100020001111
上述仅仅是,正常它是64位,第1位用来符号位,2–42是毫秒时间戳,43-52 位是 机器标识位,53-64位是全局自增ID,这样就实现了分布式ID,那有多大的数据呢?10位机器标识位可以最多1024台机器,12位全局自增ID最多4096个ID,每毫秒可以得到:1024*4096=4194304个ID,通俗一点就是每毫秒420万左右的ID。
优点:
- 高并发场景下生成速度快
- 无序,不可被猜测
缺点:
- 时钟回拨,这样时间造成的ID重复,也补救方法,跟上一个时间进行比较,抛异常或者其他方法补救。
电商场景中用户下单订单号这种可以使用此方法。当然如果你感觉64位还挺大的,你可以适当缩小一点,比如用秒来作为时间戳单位,机器位少一些,自增ID少一些,这样就很好了。
额外讲解
可以不用二进制吗?用十进制或十六进制,这样表示的范围就很大了,就非常可观了。我觉得可以,位数也可以不用这么多,提高进制可以达到一样的效果。