雪花算法
雪花算法生成的ID可用于做分布式系统ID
生成的ID格式 1位标识符(始终是0)+41位时间戳 + 10位机器标识符(5位datacenterId+5位WorkId) +12位序列
41位时间戳=当前时间截 - 开始时间截,这里的的开始时间截,是我们的id生成器开始使用的时间,由程序指定的
机器标识符就是分布式系统中每台机的标识ID
优点:64位二进制转成十进制是19位 长度短 且根据算法生成,可以反推
缺点:因为算法中有时间戳,所以如果机器时钟回拨,有可能ID重复
反推:我可以在10位机器标识符那里,用5位做机房ID,5位做机器ID
比如说生成的ID中那10位机器标识符是这样:0010100001 我取前5位(00101),转成10进制得到5,那我就知道对应的机房ID为5
再取后5位(00001),转成10进制得到1,那我就知道对应的机器 ID是1
雪花算法拥有两个变量datacenterId和workerId
snowflake通过这两个变量来实现分布式系统下每个服务生成不重复的ID, 但是这两个变量取值必须在 1 - 31之间(包括)
也就是snowflake最多只能支持31*31=961个节点同时使用,且每个节点的datacenterId和workerId不能重复
5位(bit)可以表示的最大正整数是 2^{5}-1 = 31 ,即可以用 0、1、2、3、….31 这 32 个数字,来表示不同的 datecenterId 或 workerId
这就是它比UUID好的地方 长度短而且可以反推
SnowFlake可以保证:
- 同一台服务器所有生成的id按时间趋势递增
- 整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)
雪花算法主键重复有两个可能(总结)
1.时钟回拨,解决方案,停止服务器的时钟自动同步
2.datecenterId和workdId在各服务中都是一样的值,导致主键重复,各服务的这两个变量不要重复
还没有评论,来说两句吧...