雪花算法

雪花算法生成的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可以保证:

  1. 同一台服务器所有生成的id按时间趋势递增

  2. 整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)

雪花算法主键重复有两个可能(总结)

1.时钟回拨,解决方案,停止服务器的时钟自动同步

2.datecenterId和workdId在各服务中都是一样的值,导致主键重复,各服务的这两个变量不要重复

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值