资讯专栏INFORMATION COLUMN

雪花算法(05)毫秒内序列

时飞 / 2691人阅读

摘要:前面的内容把雪花算法的时间部分和机器信息部分都生成了,下面来生成最后一部分,就是毫秒内的序列。这样毫秒内的序列数就算获取成功了。



前面的内容把雪花算法的时间部分和机器信息部分都生成了,下面来生成最后一部分,就是毫秒内的序列。什么意思呢?我们在生成时间部分获取时间戳的时候,使用 long now = System.currentTimeMillis(); 获取,是个毫秒级的时间戳,但是即使是这么短的时间,对于电脑来说也足够生成很多个id,所以很多id可能会在同一个毫秒内生成,也就是时间部分的数值一样。这个时候就要让同一个毫秒内生成的id加上数字序列标识,就是第三部分的序列。第三部分占的长度是12位,转成整数值就是4095,所以最后一部分的范围就是4095到0之间的数字。如果毫秒内访问的数量超过了这个限制怎么办?没法解决,只能强制等到下一毫秒再生产id。这就是第三部分的作用。




下面先定义一个序列初始值:


序列由于和时间戳有关系,所以要加载时间戳真正开始使用之前:


上面的逻辑做了判断,同一毫秒内就让序列加1,超过4095,就强制获取下一毫秒的值,等时间戳不是同一毫秒的时候,序列从新开始计算。看下如何强制获取下一毫秒:


简单粗暴,就是while循环等下一毫秒就可以。这样毫秒内的序列数就算获取成功了。




我们三大部分的数字都获取成功了,最后直接位移加合并就行:


这样雪花算法就写完了,下面执行一下测试:


是一个18位的long类型数字,确实是我们要的结果。等等!是不是有问题?如果此时多个线程访问,会产生重复的id!现在的程序确实有多并发问题,需要加上锁:



这样我们的雪花算法算是初步完成了。基本也符合项目对唯一id的要求!现在的写法和网上的例子还有些差别,下面我们讲讲差别相关的内容。


代码地址:https://gitee.com/blueses/sno... 05

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76147.html

相关文章

  • 雪花算法(07)雪花算法最终版

    摘要:雪花算法初步完成后,我们讨论了几个位运算的写法,大家知道雪花算法一旦确定后,很多数字都是定死的,比如机器占多少位,或者时间向左位移多少,这些在算法具体逻辑确定后就不会变了。 雪花算法初步完成后,我们讨论了几个位运算的写法,大家知道雪花算法一旦确定后,很多数字都是定死的,比如机器占多少位,或者时间向左位移多少,这些在算法具体逻辑确定后就不会变了。那么写成最后的数字和用位运算计算出来有什么...

    piapia 评论0 收藏0
  • 分布式id生成方案概述

    摘要:序本文主要来聊聊分布式的生成方案。分布式的生成,以为代表的,系列算法采用的就是划分命名空间并行生成的思路。 序 本文主要来聊聊分布式id的生成方案。 目标 业务系统需要什么样的ID生成器中提出了几点目标: 唯一性 时间相关 粗略有序 可反解 可制造 主要思路 对于每个标识,都需要有一个命名空间(namespace),来保证其相对唯一性。分布式的ID生成,以Twitter Snowf...

    Terry_Tai 评论0 收藏0
  • 关于生成订单号规则的一些思考

    摘要:关于我为什么写这篇文章是因为今天在做订单模块的时候看到之前的上描述的年月日用户位企业位四位自增长数。背景对于其定订单的生成。个人的看法是主要是唯一,其他关于业务方面的不是太太重要。自增实现了用于将的值递增,并返回结果。 关于我为什么写这篇文章是因为今天在做订单模块的时候,看到之前的PRD上描述的年月日+用户id2位+企业id位+四位自增长数。然后竟被我反驳的突然改成了精确时间+4位自增...

    omgdog 评论0 收藏0
  • 雪花算法 - snowflake

    摘要:有些时候我们希望能使用一种简单一些的,并且希望能够按照时间有序生成。转换成字符串后长度最多生成的整体上按照时间自增排序,并且整个分布式系统内不会产生碰撞由和作区分,并且效率较高。经测试每秒能够产生万个。 概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我...

    lemon 评论0 收藏0
  • 雪花算法(01)介绍

    摘要:雪花算法生成的最终结果其实就是一个类型的长整型数字,这是一个大前提算法所有的内容都是针对这个数字进行运算的。根据上面的理论可以开始学习雪花算法。 针对每个公司,随着服务化演进,单个服务越来越多,数据库分的越来越细,有的时候一个业务需要分成好几个库,这时候自增主键或者序列之类的主键id生成方式已经不再满足需求,分布式系统中需要的是一个全局唯一的id生成规则。既然号称在全局分布式系统中唯一...

    or0fun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<