本发明涉及计算机,具体涉及一种分布式唯一id生成方法、装置和电子设备。
背景技术:
1、目前的互联网服务基本是分布式、微服务形式的,大数据量也导致分库分表的产生,对于水平分表就需要保证表中id的全局唯一性。雪花算法是推特开源的分布式id生成算法,用于在不同的机器上生成唯一的id。如图1所示,雪花算法的原理是为机器生成一个64比特位的long类型的唯一id。其中,第一位为0不使用,在2进制中,数字的第一位表示正负,0表示正,所以第一位为0表示生成的分布式id是一个正数。时间戳41位用于表示当前时间的毫秒值,可以表示从0到(2^41)-1毫秒,每一毫秒按照自增的方式生成id,换算成年份是69年,换言之,使用雪花算法可以保证69年都不会生成重复id。之后的10位是机器码,机器码分为机房号和机器号,共可以表示2^10=1024台不同的机器。一般前五位表示机房号,后五位表示机器号。最后12位表示序列号,如果同一台机器在同一毫秒生成了多个id,他们的前52位完全相同(时间戳、机房号和机器号完全相同),从而使用序列号对生成的id进行区分。在当前毫秒中,第一个生成的id序列号为0,第二个为1,以此类推,最多表示2^12=4096个数,因此一台机器在一毫秒最多生成4096个id,换言之,雪花算法可以在69年内最多支持1024台机器同时在每一毫秒生成4096个不重复的id。但是雪花算法的主要缺点在于,雪花算法依赖服务器时间,当服务器发生时钟回拨时生成重复id,造成工作机器的id分配混乱。
技术实现思路
1、有鉴于此,本发明实施方式提供了一种分布式唯一id生成方法、装置和电子设备,从而避免了服务器发生时钟回拨时生成重复id的问题。
2、根据第一方面,本发明实施例提供了一种分布式唯一id生成方法,所述方法包括:设置机器id的格式为第一位为0,并设置从第二位开始的前预设位数表示机器号,后预设位数表示序列号,所述前预设位数与所述后预设位数的加和等于63,所述后预设位数的取值范围是36~38;当为某个机器生成机器id时,判断当前机器是否重启;若当前机器没有重启,则将上一个生成的机器id中的序列号加1,生成当前的机器id;将所述当前的机器id赋予当前机器。
3、可选地,在所述将所述当前的机器id赋予当前机器之前,所述方法还包括:若当前机器重启,则将上一个生成的机器id中的机器号和序列号均加1,生成当前的机器id。
4、可选地,所述机器号的位数是25位,所述序列号的位数是38位。
5、可选地,所述若当前机器没有重启,则将上一个生成的机器id中的序列号加1,生成当前的机器id,包括:若当前机器没有重启,预生成多个备用机器id,并将所述备用机器id添加到缓存数组中;其中每个备用机器id互不相同,各个备用机器id通过当前机器号分别与不同的序列号组合得到;从缓存的备用机器id中提取目标id作为当前的机器id,所述目标id中的机器号与上一个生成的机器id中的机器号相同,且相对于上一个生成的机器id中的序列号加1。
6、可选地,所述方法还包括:以预设周期检查所述缓存数组中备用机器id的剩余量;若所述剩余量低于缓存数组容量的预设百分比,则继续预生成多个备用机器id对所述缓存数组进行填充。
7、可选地,所述缓存数组容量是65536个id。
8、可选地,配置生成机器id的任务为单线程任务。
9、根据第二方面,本发明实施例提供了一种分布式唯一id生成装置,所述装置包括:格式配置模块,用于设置机器id的格式为第一位为0,并设置从第二位开始的前预设位数表示机器号,后预设位数表示序列号,所述前预设位数与所述后预设位数的加和等于63,所述后预设位数的取值范围是36~38;重启判断模块,用于当为某个机器生成机器id时,判断当前机器是否重启;id生成模块,用于若当前机器没有重启,则将上一个生成的机器id中的序列号加1,生成当前的机器id;id分配模块,用于将所述当前的机器id赋予当前机器。
10、根据第三方面,本发明实施例提供了一种电子设备,包括:存储器和处理器,所述存储器和所述处理器之间互相通信连接,所述存储器中存储有计算机指令,所述处理器通过执行所述计算机指令,从而执行第一方面,或者第一方面任意一种可选实施方式中所述的方法。
11、根据第四方面,本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使计算机执行第一方面,或者第一方面任意一种可选实施方式中所述的方法。
12、本申请提供的技术方案,具有如下优点:
13、本申请提供的技术方案,设置机器id的格式为第一位为0,并设置从第二位开始的前预设位数表示机器号,后预设位数表示序列号,其中前预设位数与后预设位数的加和等于63,后预设位数的取值范围是36~38。当为某个机器生成机器id时,若当前机器没有重启,则获取当前机器上一个生成的机器id,并按照机器号不变且序列号加1的方式,生成当前新的机器id,最后将当前的机器id赋予当前机器。通过这一方式,在机器没有重启的条件下,不论服务器的时间是否发生了回拨,只要生成新id就将序列号自增1。由于序列号的位数在36~38之间,序列号位数较多,故生成的机器id突破了4096的限制,最少也能生成687亿个机器id,不仅在一定时间段内生成的id数量能够满足用户需求,同时还可以忽略时间回拨的影响。
1.一种分布式唯一id生成方法,其特征在于,所述方法包括:
2.根据权利要求1所述的方法,其特征在于,在所述将所述当前的机器id赋予当前机器之前,所述方法还包括:
3.根据权利要求1所述的方法,其特征在于,所述机器号的位数是25位,所述序列号的位数是38位。
4.根据权利要求1所述的方法,其特征在于,所述若当前机器没有重启,则将上一个生成的机器id中的序列号加1,生成当前的机器id,包括:
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
6.根据权利要求5所述的方法,其特征在于,所述缓存数组容量是65536个id。
7.根据权利要求1所述的方法,其特征在于,配置生成机器id的任务为单线程任务。
8.一种分布式唯一id生成装置,其特征在于,所述装置包括:
9.一种电子设备,其特征在于,包括:
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使计算机执行如权利要求1-7任一项所述的方法。