一种快速生成分布式系统唯一id的方法及装置
技术领域
1.本发明涉及分布式系统技术领域,特别是涉及一种快速生成分布式系统唯一id的方法及装置。
背景技术:
2.系统唯一id是我们在设计一个系统的时候常常会遇见的问题,例如在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识,例如生成唯一主键,或者是生成消息队列的唯一消息id,并且随着计算机技术的发展,对于不同的业务的产品系统中的数据也随之增长,对数据分库分表后需要有一个唯一id来标识一条数据或消息,因此,针对每一条数据或消息生成全局唯一id的系统是非常必要的。
3.现有的典型方案包括如下几种:
4.1、数据库自增长序列或字段方式:是最常见的方式,利用数据库,全数据库唯一。
5.该方案的优点是:1)简单,代码方便,性能可以接受;2)数字id天然排序,对分页或者需要排序的结果很有帮助。
6.然而,该方案也存在如下缺点:1)不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理;2)在单个数据库或读写分离或一主多从的情况下,只有一个主库可以生成。有单点故障的风险;3)在性能达不到要求的情况下,比较难于扩展;4)如果遇见多个系统需要合并或者涉及到数据迁移会相当痛苦;5)分表分库的时候会有麻烦。
7.2、uuid(universally unique identifier,通用唯一识别码)方式:可以利用数据库也可以利用程序生成,一般来说全球唯一。
8.该方案的优点是:1)简单,代码方便;2)生成id性能非常好,基本不会有性能问题;3)全球唯一,在遇见数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对。
9.然而,其也存在如下缺点:1)没有排序,无法保证趋势递增;2)uuid往往是使用字符串存储,查询的效率比较低;3)存储空间比较大,如果是海量数据库,就需要考虑存储量的问题;4)传输数据量大;5)不可读。
10.3、利用redis(高性能的key-value数据库)生成id方式:
11.该方式依赖于redis是单线程的,所以也可以用生成全局唯一的id,可以用redis的原子操作incr和incrby来实现。具体地,可以使用redis集群来获取更高的吞吐量,假如一个集群中有5台redis,可以初始化每台redis的值分别是1,2,3,4,5,然后步长都是5。各个redis生成的id为:
12.a:1,6,11,16,21
13.b:2,7,12,17,22
14.c:3,8,13,18,23
15.d:4,9,14,19,24
16.e:5,10,15,20,25
17.请求随便负载到哪个机器都已经确定好了。其实使用3-5台服务器基本能够满足获得不同的id。使用redis集群方式防止单点故障的问题。
18.另外,比较适合使用redis来生成每天从0开始的流水号。比如订单号=日期+当日自增长号。可以每天在redis中生成一个key,使用incr进行累加。
19.上述方式的优点在于:1)不依赖于数据库,灵活方便,且性能优于数据库;2)数字id天然排序,对分页或者需要排序的结果很有帮助。
20.但上述方式也有缺点,缺点如下:1)如果系统中没有redis,还需要引入新的组件,增加系统复杂度;2)需要编码和配置的工作量比较大。
技术实现要素:
21.为克服上述现有技术存在的不足,本发明之目的在于提供一种快速生成分布式系统唯一id的方法及装置,以实现快速生成分布式系统唯一id的目的。
22.为达上述目的,本发明提出一种快速生成分布式系统唯一id的方法,包括如下步骤:
23.步骤s1,每个项目启动时,获取并计算当前时间戳差值;
24.步骤s2,从redis缓存中获取存储的自增值,利用该自增值计算获得数据标识id和机器id;
25.步骤s3,判断当前时间是否小于当前项目上一次的id生成时间;
26.步骤s4,根据步骤s3的判断结果进行毫秒内序列计数;
27.步骤s5,将得到的当前时间戳差值、数据标识id、机器id以及毫秒内序列进行融合,得到最终的分布式系统唯一id。
28.优选地,于步骤s1中,获取当前时间戳与开始时间戳,并计算当前时间戳与开始时间戳的差值作为所述当前时间戳差值。
29.优选地,步骤s2进一步包括:
30.步骤s200,根据所要生成的数据标识id和机器id的数值类型构建key值与value值的映射表;
31.步骤s201,根据所要生成的工作机器id的位数将获得的自增值与相应位数的二进制最大值进行与运算,并将与运算的结果转化为所要生成的工作机器id的数值类型;
32.步骤s202,获取转换后的结果,将其转换为字符串类型,并分别获取其中的字符串,于所述映射表中获取对应的value值作为对应的数据标识id和机器id。
33.优选地,于步骤s201中,将获得的自增id与1023进行与运算,并将结果转化为32进制,得到两位的32进制结果。
34.优选地,于步骤s202中,获取转换后的32进制结果,将其转换为字符串类型,并分别获取其中的第一个和第二个字符串,于所述映射表中获取对应的value值作为对应的数据标识id和机器id。
35.优选地,步骤s4进一步包括:
36.步骤s400,若当前时间大于当前项目上一次的id生成时间,则将毫秒内序列重置为0,进入步骤s5;
37.步骤s401,若当前时间等于当前项目上一次的id生成时间,则获取毫秒内序列,并
将其加1后与所要得到的毫秒内序列位数的最大值进行与运算,若得到的结果为0,则重新获取新时间戳后进入步骤s5,否则直接进入步骤s5;
38.步骤s402,若当前时间小于当前项目上一次的id生成时间,则抛出异常。
39.优选地,所述毫秒内序列采用12位序列表示毫秒内序列号,12位的计数顺序号支持每个节点每毫秒产生4096个id序号。
40.优选地,于步骤s5中,所述融合的步骤包括:
41.将得到的当前时间戳差值左移22位;
42.将数据标识id左移17位;
43.将机器标识id左移12位;
44.将左移22位的当前时间戳差值、左移17位的数据标识id、左移12位的机器标识id、毫秒内计数序列进行或运算,得到最终的分布式系统唯一id。
45.为达到上述目的,本发明还提供一种快速生成分布式系统唯一id的装置,包括:
46.时间戳获取单元,用于在每个项目启动时,获取并计算当前时间戳差值;
47.工作机器id计算单元,用于从redis缓存中获取存储的自增值,利用该自增值计算获得数据标识id和机器标识id,作为工作机器id;
48.时间判断单元,用于判断当前时间是否小于上一次的id生成时间;
49.毫秒内计数序列计算单元,用于根据所述时间判断单元的判断结果进行毫秒内序列计数;
50.融合单元,用于将得到的当前时间戳差值、数据标识id、机器id以及毫秒内序列进行融合,得到最终的分布式系统唯一id。
51.优选地,于所述毫秒内计数序列计算单元中,若当前时间大于上一次的id生成时间,则将毫秒内序列重置为0后,进入所述融合单元;若当前时间等于上一次的id生成时间,则获取毫秒内序列,并将其加1后与所要得到的毫秒内序列位数的最大值进行与运算,若得到的结果为0,则重新获取新时间戳后进入融合单元,否则直接进入融合单元。
52.与现有技术相比,本发明一种快速生成分布式系统唯一id的方法及装置通过利用redis中维护一个自增值,利用该自增值在项目启动时计算得到数据标识id及机器标识id,并通过获取时间戳差值、毫秒内计数序列对其融合,实现了快速生成分布式系统唯一id的目的,解决了分布式系统中数据标识id和机器id,在多实例情况下的唯一性问题,保证了分布式系统唯一id,本发明支持每个服务最多达1024台实例同时在线,并且项目一旦启动每个实例的数据标识id和机器id标识即初始化完成。
附图说明
53.图1为本发明一种快速生成分布式系统唯一id的方法的步骤流程图;
54.图2为本发明具体实施例中分布式系统唯一id的结构图;
55.图3为本发明一种快速生成分布式系统唯一id的装置的系统架构图;
56.图4为本发明实施例中生成分布式系统唯一id的流程图;
57.图5为本发明实施例中生成数据标识id和机器标识id的流程图。
具体实施方式
58.以下通过特定的具体实例并结合附图说明本发明的实施方式,本领域技术人员可由本说明书所揭示的内容轻易地了解本发明的其它优点与功效。本发明亦可通过其它不同的具体实例加以施行或应用,本说明书中的各项细节亦可基于不同观点与应用,在不背离本发明的精神下进行各种修饰与变更。
59.图1为本发明一种快速生成分布式系统唯一id的方法的步骤流程图。如图1所示,本发明一种快速生成分布式系统唯一id的方法,包括如下步骤:
60.步骤s1,每个项目(即服务器实例)启动时,获取并计算当前时间戳差值(当前时间和开始时间starttime的差值,其中starttime可以指定为固定值)。
61.在本发明具体实施例中,所生成的分布式id中包含有时间戳信息,该时间戳信息不是存储当前时间的时间戳,而是时间戳差值,即当前时间戳-开始时间戳得到的值,这里的开始时间戳,一般是本发明之id生成装置开始使用的时间,由程序来指定的(starttime属性)。
62.步骤s2,从redis缓存中获取存储的自增值,利用该自增值计算获得数据标识id和机器id。
63.也就是说,本发明之生成分布式系统唯一id的方法是基于redis数据库的,每个项目在redis中维护一个自增id,每次项目启动时可获取该自增id。
64.具体地,步骤s2进一步包括:
65.步骤s200,根据所要生成的数据标识id和机器id的数值类型构建key值与value值的映射表(map)。
66.在本发明具体实施例中,使用两位32进制数值表示数据标识id和机器id(即数据id和机器id共占用10bit,各占用5bit),其中高位为数据标识id,低位为机器id标识,因此构建映射表(map)存储key为0~9,a~v的值,对应的value分别为0~31,如下表1所示:
67.表1
68.keyvaluekeyvaluekeyvaluekeyvalue00112233445566778899a10b11c12d13e14f15g16h17i18j19k20l21m22n23o24p25q26r27s28t29u30v31
69.步骤s201,根据所要生成的工作机器id的位数将获得的自增值与相应位数的二进制最大值进行与运算,并将与运算的结果转化为32进制,得到两位的32进制结果。
70.在本发明具体实施例中,所要生成的工作机器id(包括数据标识id与机器id标识)为10位二进制数,因此为了防止得到的数值超过1024,即2的10次方,因此将redis中维护的自增id与1023进行与运算,当然将自增值与1024进行取余也可以,但与运算相对取余效率更高。
71.每次项目启动时,从redis获取项目设置的某个key对应的值id,如redis不存在则为1,若存在则将该值加1,更新redis并返回加1后的值id,假设当前值为自增id=10,
72.将得到的自增id(10)和1023进行与运算,即
73.00 0000 1010
74.11 1111 1111
75.00 0000 1010
76.根据上面与运算,10&1023的结果等于10,并将其转化为32进制,结果为a,得到的值不足2位则左补零,故可得0a。
77.步骤s202,分别获取转换后的32进制结果,将其转换为字符串类型,并获取其中的第一个和第二个字符串,于映射表(map)中获取对应的value值作为对应的数据标识id和机器id。
78.在本发明具体实施例中,将32进制结果“0a”转化为字符串类型,并拆分成key1=0和key2=a,然后从表1的map中获取对应的value值作为对应的数据标识id和机器标识id,从而得到数据标识id为0,机器标识id为10。
79.步骤s3,判断当前时间是否小于本项目上一次的id生成时间。
80.具体地,通过long now=system.currenttimemillis()获取当前时间戳,将其与当前项目上一次的id生成时间的时间戳进行比对。
81.步骤s4,根据步骤s3的判断结果进行毫秒内序列计数。
82.具体地,步骤s4进一步包括:
83.步骤s400,若当前时间大于本项目上一次的id生成时间,则将毫秒内序列重置为0,进入步骤s5。
84.在本发明具体实施例中,在生成的分布式唯一id中,采用12位序列用来表示毫秒内序列号,即毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间戳)产生4096个id序号。
85.步骤s401,若当前时间小于本项目上一次的id生成时间,则抛出异常,无需时间回退。
86.具体地说,当根据步骤s3的判断结果得出当前时间小于本项目上一次的id生成时间,则显示异常,需要运维手动调整。
87.步骤s402,若当前时间等于本项目上一次的id生成时间(由于本发明采用的是毫秒级的时间戳,在大量请求并发情况下,当前时间与本项目上一次id生成时间可能相同),则获取毫秒内序列,并将其加1后与所要得到的毫秒内序列位数的最大值进行与运算,若得到的结果为0,则重新获取新时间戳后进入步骤s5,否则直接进入步骤s5。
88.在生成当前时间戳时,使用long now=system.currenttimemillis()获取,它是个毫秒级的时间戳,但是即使是这么短的时间,对于计算机来说也足够生成很多个id,所以很多id可能会在同一个毫秒内生成,也就是时间部分的数值相同,此时则需让同一个毫秒内生成的id加上毫秒内序列标识,在本发明具体实施例中,该毫秒内序列标识通过获取毫秒内序列,将其加1后与所要得到的毫秒内序列位数的最大值进行与运算获得,本发明采用12位序列用来表示毫秒内序列号,那么毫秒内序列标识的范围就是4095到0之间的数字,如果毫秒内访问的数量超过该限制,则只能强制等到下一毫秒再生产id。
89.步骤s5,将得到的当前时间戳差值、数据标识id、机器id以及毫秒内序列进行融合,得到最终的分布式系统唯一id。
90.在本发明具体实施例中,所要生成的分布式系统唯一id的结构如图2所示,其具体结构如下:
91.1位标识,由于long基本类型在java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0,暂且不使用。
92.41位时间戳(毫秒级):在本发明中,该41位时间戳不是存储当前时间的时间戳,而是存储时间戳的差值(当前时间戳-开始时间戳)得到的值,这里的的开始时间戳,一般是我们的id生成器开始使用的时间,由我们程序来指定的(starttime属性)。本发明采用41位的时间戳,可以使用69年,即:年t=(1l《《41)/(1000l*60*60*24*365)=69。
93.10位的数据机器位:可以部署在1024个节点,包括5位datacenterid和5位workerid
94.12位序列:毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间戳)产生4096个id序号。
95.以上加起来总共64位,即分布式系统唯一id为64位,其为一个long型。本发明之分布式唯一id结构的优点是:整体上按照时间自增排序,并且整个分布式系统内不会产生id碰撞(由数据中心id和机器id作区分),并且效率较高,经测试,每秒能够产生26万id左右。
96.在本发明具体实施例中,针对该分布式唯一id的结构,将得到的当前时间戳差值、数据标识id、机器id以及毫秒内序列进行融合的过程如下:
97.先将得到的当前时间戳差值(当前时间戳-开始时间戳)左移22位,然后将数据标识id左移17位,再将机器标识id左移12位,然后将左移22位的时间戳差值、左移17位的数据标识id、左移12位的机器标识id、毫秒内计数序列进行或运算,得到最终的分布式系统唯一id。
98.图3为本发明一种快速生成分布式系统唯一id的装置的系统架构图。如图3所示,本发明一种快速生成分布式系统唯一id的装置,包括:
99.时间戳获取单元301,用于在每个项目启动时,获取并计算当前时间戳差值,即当前时间与开始时间starttime的差值,其中starttime可以指定为固定值)。
100.在本发明具体实施例中,所要生成的分布式id中包含有时间戳信息,该时间戳信息不是存储当前时间的时间戳,而是时间戳差值,即当前时间戳-开始时间戳得到的值,这里的的开始时间戳,一般是id生成器开始使用的时间,由程序来指定的(starttime属性)。
101.工作机器id计算单元302,从redis缓存中获取存储的自增值,利用该自增值计算获得数据标识id和机器标识id,作为工作机器id。
102.也就是说,本发明之生成分布式系统唯一id的方法是基于redis数据库的,每个项目在redis中维护一个自增id,每次项目启动时可获取该自增id。
103.具体地,工作机器id计算单元302进一步包括:
104.映射表构建模块,用于根据所要生成的数据标识id和机器id的数值类型构建key值与value值的映射表(map)。
105.在本发明具体实施例中,使用两位32进制数值表示数据标识id和机器id,其中高位为数据标识id,低位为机器id标识,因此构建映射表(map)存储key为0~9,a~v的值,对
应的value分别为0~31。
106.自增值获取及计算模块,用于根据所要生成的工作机器id的位数将获得的自增值与相应位数的二进制最大值进行与运算,并将与运算的结果转化为32进制,得到两位的32进制结果。
107.在本发明具体实施例中,所要生成的工作机器id(包括数据标识id与机器id标识)为10位二进制数,因此为了防止得到的数值超过1024,即2的10次方,因此将redis中维护的自增id与1023进行与运算,当然将自增值与1024进行取余也可以,但与运算相对取余效率更高。
108.每次项目启动时,从redis获取项目设置的某个key对应的值id,如redis不存在则为1,若存在则将该值加1,更新redis并返回加1后的值id,假设当前值为自增id=10,
109.将得到的自增id(10)和1023进行与运算,即
110.00 0000 1010
111.11 1111 1111
112.00 0000 1010
113.根据上面与运算,10&1023的结果等于10,并将其转化为32进制,结果为a,得到的值不足2位则左补零,故可得0a。
114.数据标识id及机器标识id确定模块,用于分别获取转换后的32进制结果,将其转换为字符串类型,并获取其中的第一个和第二个字符串,于映射表(map)中获取对应的value值作为对应的数据标识id和机器id。
115.在本发明具体实施例中,将32进制结果“0a”转化为字符串类型,并拆分成key1=0和key2=a,然后从表1的map中获取对应的value值作为对应的数据标识id和机器标识id,从而得到数据标识id为0,机器标识id为10。
116.时间判断单元303,用于判断当前时间是否小于本项目上一次的id生成时间。
117.毫秒内计数序列计算单元304,用于根据时间判断单元302的判断结果进行毫秒内序列计数,若当前时间大于本项目上一次的id生成时间,则将毫秒内序列重置为0后,进入融合单元305,若当前时间等于上一次的id生成时间,则获取毫秒内序列,并将其加1后与所要得到的毫秒内序列位数的最大值进行与运算,若得到的结果为0,则重新获取新时间戳后进入融合单元304,否则直接进入融合单元305;若当前时间小于上一次的id生成时间,则抛出异常,无需时间回退。
118.在本发明具体实施例中,在生成的分布式唯一id中,采用12位序列用来表示毫秒内序列号,即毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间戳)产生4096个id序号。
119.融合单元305,用于将得到的当前时间戳差值、数据标识id、机器id以及毫秒内序列进行融合,得到最终的分布式系统唯一id。
120.在本发明具体实施例中,针对该分布式唯一id的结构,融合单元305将得到的当前时间戳差值、数据标识id、机器id以及毫秒内序列进行融合的过程如下:
121.先将得到的当前时间戳差值(当前时间戳-开始时间戳)左移22位,然后将数据标识id左移17位,再将机器标识id左移12位,然后将左移22位的时间戳差值、左移17位的数据标识id、左移12位的机器标识id、毫秒内计数序列进行或运算,得到最终的分布式系统唯一
id。
122.实施例
123.图4为本发明实施例中生成分布式系统唯一id的流程图,在本实施例中,生成分布式系统唯一id的过程如下:
124.步骤1,在项目启动时根据上述步骤s2的过程得到数据标识id和机器id。
125.图5为本发明实施例中生成数据标识id和机器标识id的流程图。在本实施例中,步骤1进一步包括:
126.步骤1.1,使用映射表map存储key为0~9、a~v的值并将其分别设置为与0~31相对应(如下表所示)。
127.keyvaluekeyvaluekeyvaluekeyvalue00112233445566778899a10b11c12d13e14f15g16h17i18j19k20l21m22n23o24p25q26r27s28t29u30v31
128.1.2服务启动时获取redis缓存中维护的一个自增值idlncr,将该值idlncr和1023做与运算得到范围rangeid,将得到的值rangeid转换为32进制rangestr,若该值rangestr不足2位则左补零,分别获取转换后的rangestr的第一个和第二个字符串对应的map中的值即为对应的数据标识id和机器标识id。
129.在本实施例中,使用两位32进制数值表示数据标识id和机器id,其中高位为数据标识id,低位为机器标识id,相对应key值的value值即为是十进制id值。
130.步骤2,判断当前时间是否小于上一次的id生成时间。
131.步骤3,若当前时间大于上一次的id生成时间,则将毫秒内序列重置为0。
132.在本发明具体实施例中,在生成的分布式唯一id中,采用12位序列用来表示毫秒内序列号,即毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间戳)产生4096个id序号。
133.步骤4,若当前时间等于上一次的id生成时间,则获取毫秒内序列,并将其加1后与所要得到的毫秒内序列位数的最大值进行与运算,若得到的结果为0,则重新获取新时间戳,否则直接进入步骤5
134.步骤5,将得到的当前时间戳差值(当前时间戳-开始时间戳)左移22位,然后将数据标识id左移17位,再将机器标识id左移12位,最后将左移22位的时间戳差值、左移17位的数据标识id、左移12位的机器标识id、毫秒内计数序列进行或运算,得到最终的分布式系统唯一id。
135.以下为本发明实施例中利用本发明生成不同id数量的耗时统计(算法生成id需要时间(单位:毫秒)):
[0136][0137]
可见,通过本发明,实现了快速高效生成分布式系统唯一id的目的。
[0138]
综上所述,本发明一种快速生成分布式系统唯一id的方法及装置通过利用redis中维护一个自增值,利用该自增值在项目启动时计算得到数据标识id及机器标识id,并通过获取时间戳差值、毫秒内计数序列对其融合,实现了快速生成分布式系统唯一id的目的,解决了分布式系统中数据标识id和机器id,在多实例情况下的唯一性问题,保证了分布式系统唯一id,本发明支持每个服务最多达1024台实例同时在线,并且项目一旦启动每个实例的数据标识id和机器id标识即初始化完成。
[0139]
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何本领域技术人员均可在不违背本发明的精神及范畴下,对上述实施例进行修饰与改变。因此,本发明的权利保护范围,应如权利要求书所列。
技术特征:
1.一种快速生成分布式系统唯一id的方法,包括如下步骤:步骤s1,每个项目启动时,获取并计算当前时间戳差值;步骤s2,从redis缓存中获取存储的自增值,利用该自增值计算获得数据标识id和机器id;步骤s3,判断当前时间是否小于当前项目上一次的id生成时间;步骤s4,根据步骤s3的判断结果进行毫秒内序列计数;步骤s5,将得到的当前时间戳差值、数据标识id、机器id以及毫秒内序列进行融合,得到最终的分布式系统唯一id。2.如权利要求1所述的一种快速生成分布式系统唯一id的方法,其特征在于,于步骤s1中,获取当前时间戳与开始时间戳,并计算当前时间戳与开始时间戳的差值作为所述当前时间戳差值。3.如权利要求1所述的一种快速生成分布式系统唯一id的方法,其特征在于,步骤s2进一步包括:步骤s200,根据所要生成的数据标识id和机器id的数值类型构建key值与value值的映射表;步骤s201,根据所要生成的工作机器id的位数将获得的自增值与相应位数的二进制最大值进行与运算,并将与运算的结果转化为所要生成的工作机器id的数值类型;步骤s202,获取转换后的结果,将其转换为字符串类型,并分别获取其中的字符串,于所述映射表中获取对应的value值作为对应的数据标识id和机器id。4.如权利要求3所述的一种快速生成分布式系统唯一id的方法,其特征在于:于步骤s201中,将获得的自增id与1023进行与运算,并将结果转化为32进制,得到两位的32进制结果。5.如权利要求4所述的一种快速生成分布式系统唯一id的方法,其特征在于:于步骤s202中,获取转换后的32进制结果,将其转换为字符串类型,并分别获取其中的第一个和第二个字符串,于所述映射表中获取对应的value值作为对应的数据标识id和机器id。6.如权利要求5所述的一种快速生成分布式系统唯一id的方法,其特征在于,步骤s4进一步包括:步骤s400,若当前时间大于当前项目上一次的id生成时间,则将毫秒内序列重置为0,进入步骤s5;步骤s401,若当前时间等于当前项目上一次的id生成时间,则获取毫秒内序列,并将其加1后与所要得到的毫秒内序列位数的最大值进行与运算,若得到的结果为0,则重新获取新时间戳后进入步骤s5,否则直接进入步骤s5;步骤s402,若当前时间小于当前项目上一次的id生成时间,则抛出异常。7.如权利要求6所述的一种快速生成分布式系统唯一id的方法,其特征在于:所述毫秒内序列采用12位序列表示毫秒内序列号,12位的计数顺序号支持每个节点每毫秒产生4096个id序号。8.如权利要求6所述的一种快速生成分布式系统唯一id的方法,其特征在于,于步骤s5中,所述融合的步骤包括:将得到的当前时间戳差值左移22位;
将数据标识id左移17位;将机器标识id左移12位;将左移22位的当前时间戳差值、左移17位的数据标识id、左移12位的机器标识id、毫秒内计数序列进行或运算,得到最终的分布式系统唯一id。9.一种快速生成分布式系统唯一id的装置,包括:时间戳获取单元,用于在每个项目启动时,获取并计算当前时间戳差值;工作机器id计算单元,用于从redis缓存中获取存储的自增值,利用该自增值计算获得数据标识id和机器标识id,作为工作机器id;时间判断单元,用于判断当前时间是否小于上一次的id生成时间;毫秒内计数序列计算单元,用于根据所述时间判断单元的判断结果进行毫秒内序列计数;融合单元,用于将得到的当前时间戳差值、数据标识id、机器id以及毫秒内序列进行融合,得到最终的分布式系统唯一id。10.如权利要求9所述的一种快速生成分布式系统唯一id的装置,其特征在于,于所述毫秒内计数序列计算单元中,若当前时间大于上一次的id生成时间,则将毫秒内序列重置为0后,进入所述融合单元;若当前时间等于上一次的id生成时间,则获取毫秒内序列,并将其加1后与所要得到的毫秒内序列位数的最大值进行与运算,若得到的结果为0,则重新获取新时间戳后进入融合单元,否则直接进入融合单元。
技术总结
本发明公开了一种快速生成分布式系统唯一ID的方法及装置,所述方法包括如下步骤:步骤S1,每个项目启动时,获取并计算当前时间戳差值;步骤S2,从Redis缓存中获取存储的自增值,利用该自增值计算获得数据标识ID和机器ID;步骤S3,判断当前时间是否小于当前项目上一次的ID生成时间;步骤S4,根据步骤S3的判断结果进行毫秒内序列计数;步骤S5,将得到的时间戳差值、数据标识ID、机器ID以及毫秒内序列进行融合,得到最终的分布式系统唯一ID。得到最终的分布式系统唯一ID。得到最终的分布式系统唯一ID。
技术研发人员:熊平 曹海龙 陈德勇
受保护的技术使用者:北京无忧创想信息技术有限公司
技术研发日:2021.11.29
技术公布日:2022/3/8