雪花算法学习

雪花算法

1. 雪花算法简介

  雪花算法是一个主键ID的生成算法,使用该算法会生成一个64bit的数字作为主键,常常用于分布式分库分表场景下,用于保证主键ID的唯一性。除了雪花算法外,UUID也是较常用的主键ID生成方式。
  但相较于雪花算法,UUID生成的是32个16进制数字,虽然这样亦可以保证ID生成的唯一性,但是其32位的16进制数字入库查询的效率较差,且生成是无序的字符串,易导致数据库索引B+树的分裂,影响入库查询效率。
  基于上述的原因考虑,建议使用雪花算法来生成主键ID。

2. 雪花算法原理

雪花算法是一个64bit的数字,其组成主要由如下的几个部分:
在这里插入图片描述

符号位:0或1,代表符号,一般都是0即都是正数。
时间戳:毫秒级的时间戳。
WorkId:工作ID,服务器的唯一标识码。
序列号:每个服务器自0递增的序列号。

从上图的组成,可以分析得到如下的几点:
① 多个节点之间,符号位、时间戳一般来说是一样的,序列号也都是从0开始递增。因此区分多个节点生成的ID不同,需要保证WorkId各个节点之间不同。
② 单个节点内,符号位、WorkId、序列号都是相同的,若存在时钟回拨导致时间戳一样,也会生成同样的ID。
③ 多个节点之间由于符号位、时间戳一样导致,序列号是节点内递增,因此是不能保证生成的ID是单调递增。但可以保证的是,随着时间戳增加,后面时间生成的ID一定大于之前时间生成的ID,从而有趋势递增的特点。

3. 问题与思考

上面提到了时钟回拨的问题,考虑使用标志位来记录时钟回拨情况,具体如下:
在这里插入图片描述

使用WorkId的前两位作为时钟回拨的标志位,考虑时钟回拨不常见,故仅仅使用两位,最多可支持3次回拨。这样也使得WorkId从原先的最多1024个节点减少到256个节点。
这个需要具体情况来分析,若对运行时间要求不高,可以使用时间戳作为标志位。对集群节点数要求不高,则可以使用WorkId作为标志位,对于每毫秒并发的ID生成数量要求不高,可以使用序列号的部分位数作为标志位。

4. 雪花算法的实现



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值