雪花算法详解

在高并发场景中,雪花算法是解决ID冲突的神器

什么是雪花算法

一句话概括:

雪花算法是Twitter设计的根据时间戳、机器标识码和序列号生成的唯一长整型数

能解决什么问题

确保在大规模高并发环境中,可以生成持续递增的唯一长整型数

具有哪些特点

  1. 唯一性

  2. 持续递增

  3. 结果为长整型数字

  4. 不依赖其他系统,无需引入数据库、Redis等系统

  5. 吞吐量大,12位序列号情况下,每毫秒可生成 4095个ID

实现原理

在这里插入图片描述

符号位:仅表示正、负数,0 - 正1 - 负,雪花算法结果都为,即符号位都为0

时间戳:系统 毫秒级 时间戳

工作机器ID:大规模集群中,标识唯一机器的机器码标识

序列号:当前时间戳内的递增编号

使用中可能存在的问题

1. 机器时钟回拨可能会导致ID重复,解决办法:

参照

定义一定的回拨允许范围,比如: 5ms,程序等待5*2ms,后重新获取时间戳,进行ID生成

2. 在集群环境中可能会受到工作机器ID大小的影响,生成的ID并非绝对递增

例子:在1ms时,dataCenterId = 10;machineId=20的机器持续递增生成了id1;在2ms时,dataCenterId = 1;machineId=2的机器持续递增生成了id2,这时虽然id2在时间上先生成,但是并不能保证id2 > id1

相同的代码生成的id长度不一致,比较常见的有18位19位

原因:代码中的时间戳虽然分配了41位,并且进行了左移,但是时间戳的十进制大小区别比较大,比如:

十进制1000 ,41位二进制表示为:00000000000000000000000000000001111101000

十进制1100000000000,41位二进制表示为:10000000000011101000110111111100000000000

由此可以看出,时间戳比较临近时,时间戳差值比较小。二进制即时都是41位,表示十进制的大小也是不一样的,雪花算法的64位二进制同理。

如何解决:定制更短雪花算法生成的ID长度,方法:

建议先考虑缩短机器标识码序列号位数。毕竟有些项目,机器少、交易量小。

3. 数据中心,机器id该怎么设置

利用redis自增序列设置ID,机器启动时从redis中拿取一个ID,利用数据库,为每一台机器分配workId,保存ip和workId的关系

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值