CN108804545B - 分布式全局唯一id生成方法及设备 - Google Patents
分布式全局唯一id生成方法及设备 Download PDFInfo
- Publication number
- CN108804545B CN108804545B CN201810481891.5A CN201810481891A CN108804545B CN 108804545 B CN108804545 B CN 108804545B CN 201810481891 A CN201810481891 A CN 201810481891A CN 108804545 B CN108804545 B CN 108804545B
- Authority
- CN
- China
- Prior art keywords
- storage container
- preset storage
- ids
- preset
- generating
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Warehouses Or Storage Devices (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明公开了一种分布式全局唯一ID生成方法及设备,其中该方法包括:在业务服务的启动过程中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID;在业务服务启动后,从至少一个预设存储容器中循环取出ID,并在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID,能在执行业务服务的机器发生时间回退时生成全局唯一ID。
Description
技术领域
本发明涉及数据处理技术领域,尤其涉及一种分布式全局唯一ID生成方法及设备。
背景技术
随着业务数据量的不断增大,单表数据量过大导致数据库性能下降严重,行业通用方案是使用分库分表技术来降低每张表的数据量,从而恢复单表的性能,而这种情况下就需要生成全局唯一的身份标识号(ID)。
目前比较成熟的分布式全局唯一ID生成器,是使用推特(Twitter)开源的雪花(SnowFlake)算法来实现的。Snowflake算法生成的ID是64比特整型数,是一种数值型全局唯一ID,满足高性能(>400w/s),低延迟(<2ms)和高可用(可作为软件开发工具包(SDK)使用)的特点。同时由于依赖机器时钟,Snowflake算法生成的ID满足递增的特性。但是当执行业务服务的机器的机器时钟与标准时钟存在时间差时,会调整机器的机器时钟,从而造成时间回退,而由于Snowflake算法依赖机器时钟,因而导致在执行业务服务的机器发生时间回退时不能生成全局唯一ID。
发明内容
本发明的主要目的在于提供一种分布式全局唯一ID生成方法及设备,以解决在执行业务服务的机器发生时间回退时不能生成全局唯一ID的问题。
为实现上述目的,本发明提供了一种分布式全局唯一ID生成方法,包括:
在业务服务的启动过程中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID;
在业务服务启动后,从至少一个预设存储容器中循环取出ID,并在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID。
其中,预设存储容器的数量为至少两个;从至少一个预设存储容器中循环取出ID,并在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID的步骤,包括:
依次将至少两个预设存储容器作为当前读取容器,从当前读取容器内依次取出存储在当前读取容器内的ID,直至当前读取容器内的ID被读取完毕;
在当前读取容器内的ID被取空时,往被取空的当前读取容器中再次生成预设数量的ID。
其中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID的步骤,包括:
启动ID生成线程,依次在至少一个预设存储容器中的每个预设存储容器内生成预设数量的ID。
其中,从至少一个预设存储容器中循环取出ID的步骤,包括:
启动业务线程按照先生成先取出的方式从至少一个预设存储容器中循环取出ID。
其中,预设数量为业务服务每天所需ID的最大数量与执行业务服务的机器的最大允许回退时间的乘积;其中,回退时间为机器的机器时钟与标准时钟之间的时间差。
其中,预设存储容器为链表。
其中,ID包括1位标识位、41位毫秒级时间戳、10位机器ID和12位序列号。
其中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID的步骤,包括:
使用SnowFlake算法,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID。
本发明还提供了一种分布式全局唯一ID生成设备,包括存储器、处理器以及存储在存储器中并可在处理器上运行的计算机程序,该处理器执行计算机程序时实现上述的分布式全局唯一ID生成方法的步骤。
本发明还提供了一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时实现上述的分布式全局唯一ID生成方法的步骤。
本发明的上述方案至少包括以下有益效果:
在本发明的实施例中,通过在业务服务的启动过程中,往至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID,并在业务服务启动后,从至少一个预设存储容器中循环取出ID,且在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID,其中当在至少一个预设存储容器中的一个预设存储容器内取ID,且该预设存储容器内的ID未被取完之前,若执行业务服务的机器发生时间回退,则从该预设存储容器内直接取ID即可,不需要生成新的ID,因此不会产生任何影响;且即使回退的这段时间该预设存储容器内的ID被取完,需要往该预设存储容器内再次生成预设数量的ID,也不会有影响,因为该预设存储容器内的ID能支持业务服务使用一段时间,而机器回退的时间一般在几百毫秒内,所以此时的时间已经大于上次生成ID的时间,因此不会生成重复的ID,综上,本发明的分布式全局唯一ID生成方法能在执行业务服务的机器发生时间回退时生成全局唯一ID。
附图说明
图1为本发明第一实施例中分布式全局唯一ID生成方法的流程图;
图2为本发明第二实施例中分布式全局唯一ID生成方法的流程图;
图3为本发明第二实施例中一具体实例中分布式全局唯一ID生成方法的流程图;
图4为本发明第三实施例中分布式全局唯一ID生成方法的流程图;
图5为本发明第四实施例中分布式全局唯一ID生成方法的流程图;
图6为本发明第五实施例中分布式全局唯一ID生成设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。
第一实施例
如图1所示,本发明的具体实施例提供了一种分布式全局唯一ID生成方法,包括:
步骤11,在业务服务的启动过程中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID。
其中,在本发明的具体实施例中,上述预设存储容器主要用于存储生成的ID。具体的,上述预设存储容器可以为链表,优选双向链表。
在本发明的一具体实施例中,上述在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID的具体实现方式可以为:使用SnowFlake算法,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID,以确保生成的ID具有递增特性。具体的,上述ID可以包括1位标识位、41位毫秒级时间戳、10位机器ID和12位序列号。其中,41位毫秒级时间戳可以保证生成的ID保持递增特性,10位机器ID可以保证在不同的机器上生成不同的ID,实现分布式ID生成器,12位序列号能保证每毫秒生成4096个不同的序列号。需要说明的是,为确保后续取出的ID具有递增特性,上述预设存储容器还可以采用队列的结构实现,因为队列具有先进先出的特点,从而能确保后续取出的ID具有递增特性。
另外,在本发明的具体实施例中,上述预设数量可根据业务服务的场景决定,以确保执行业务服务的机器发生时间回退时能生成全局唯一ID。具体的,上述预设数量为业务服务每天所需ID的最大数量与执行业务服务的机器的最大允许回退时间的乘积;其中,回退时间为机器的机器时钟与标准时钟之间的时间差,执行业务服务的机器的最大允许回退时间为一个预设存储容器里面的ID从开始被取出到被取完所花费的时间,一般情况下,机器的回退时间都在几百毫秒以内,不会超过1秒,所以预设存储容器的容量不用过大。例如,一个业务服务每天生成的订单量最多为1000万,机器的最大允许回退时间为0.4天,上述预设数量可以为400万,每个预设存储容器内的ID可以供业务服务使用大约0.4天。其中,上述业务服务可以为订单服务、用户服务、项目服务等左右需要生成全局唯一ID的服务。
步骤12,在业务服务启动后,从至少一个预设存储容器中循环取出ID,并在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID。
其中,在本发明的具体实施例中,通过在业务服务的启动过程中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID,从而使得在业务服务启动后,通过从至少一个预设存储容器中循环取出ID的方式便能得到全局唯一ID。
具体的,当在至少一个预设存储容器中的一个预设存储容器内取ID,且该预设存储容器内的ID未被取完之前,若执行业务服务的机器发生时间回退,则从该预设存储容器内直接取ID即可,不需要生成新的ID,因此不会产生任何影响。另外,即使回退的这段时间该预设存储容器内的ID被取完,需要往该预设存储容器内再次生成预设数量的ID,也不会有影响,因为该预设存储容器内的ID能支持业务服务使用一段时间,而机器回退的时间一般在几百毫秒内,所以此时的时间已经大于上次生成ID的时间,因此不会生成重复的ID。
在此对上述从至少一个预设存储容器中循环取出ID包括的多种情况进行说明。其中,若预设存储容器的数量为1个,从预设存储容器中循环取出ID即为:循环从一个预设存储容器内取ID;若预设存储容器的数量为至少两个,从至少两个预设存储容器中循环取出ID可以为:先从一个预设存储容器内取ID,当该预设存储容器内的ID被取空时,取下一个预设存储容器内的ID,并按预设存储容器的编号依次循环;除此之外,若预设存储容器的数量为至少两个,从至少两个预设存储容器中循环取出ID还可以为:每个预设存储容器内取一个ID,并按预设存储容器的编号依次循环。
需要说明的是,不管从至少一个预设存储容器中循环取出ID具体为上述的哪种情况,均能确保在执行业务服务的机器发生时间回退时能生成全局唯一ID。需要进一步说明的是,当预设存储容器的数量为1个时,若预设存储容器内的ID被消费完(即被取空)时,会有一个短暂的停顿时间用于生成预设数量的ID,但这个停顿时间非常短,不会对业务服务造成太大影响。当然此时可以通过在预设存储容器多存储一些ID的方式降低对业务服务的影响。可以理解的是,当预设存储容器的数量为至少两个时,若在实际使用过程中出现由于生成ID而造成的短暂的停顿,可通过适当调整预设存储容器的数量或者预设存储容器内ID的数量的方式降低对业务服务的影响。
可见,在本发明的具体实施例中,通过在业务服务的启动过程中,往至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID,并在业务服务启动后,从至少一个预设存储容器中循环取出ID,且在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID,其中当在至少一个预设存储容器中的一个预设存储容器内取ID,且该预设存储容器内的ID未被取完之前,若执行业务服务的机器发生时间回退,则从该预设存储容器内直接取ID即可,不需要生成新的ID,因此不会产生任何影响;且即使回退的这段时间该预设存储容器内的ID被取完,需要往该预设存储容器内再次生成预设数量的ID,也不会有影响,因为该预设存储容器内的ID能支持业务服务使用一段时间,而机器回退的时间一般在几百毫秒内,所以此时的时间已经大于上次生成ID的时间,因此不会生成重复的ID,综上,本发明的分布式全局唯一ID生成方法能在执行业务服务的机器发生时间回退时生成全局唯一ID。
其中,在本发明的具体实施例中,上述步骤11中在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID的具体实现方式可以为:启动ID生成线程,依次在至少一个预设存储容器中的每个预设存储容器内生成预设数量的ID;且同时上述步骤12中从至少一个预设存储容器中循环取出ID的具体实现方式为:启动业务线程按照先生成先取出的方式从至少一个预设存储容器中循环取出ID,从而能够确保取出的ID具有递增特性。
第二实施例
如图2所示,本发明的具体实施例提供了一种分布式全局唯一ID生成方法,在该具体实施例中,预设存储容器的数量为至少两个,上述分布式全局唯一ID生成方法包括如下步骤:
步骤21,在业务服务的启动过程中,在至少两个预设存储容器中的每个预设存储容器内均生成预设数量的ID。
其中,在本发明的具体实施例中,上述预设存储容器主要用于存储生成的ID。具体的,上述预设存储容器可以为链表,优选双向链表。且在本发明的具体实施例中,可使用SnowFlake算法,在至少两个预设存储容器中的每个预设存储容器内均生成预设数量的ID,以确保生成的ID具有递增特性。具体的,上述ID包括1位标识位、41位毫秒级时间戳、10位机器ID和12位序列号。其中,41位毫秒级时间戳可以保证生成的ID保持递增特性,10位机器ID可以保证在不同的机器上生成不同的ID,实现分布式ID生成器,12位序列号能保证每毫秒生成4096个不同的序列号。需要说明的是,为确保后续取出的ID具有递增特性,上述预设存储容器还可以采用队列的结构实现,因为队列具有先进先出的特点,从而能确保后续取出的ID具有递增特性。
另外,在本发明的具体实施例中,上述预设数量可根据业务服务的场景决定,以确保执行业务服务的机器发生时间回退时能生成全局唯一ID。具体的,上述预设数量为业务服务每天所需ID的最大数量与执行业务服务的机器的最大允许回退时间的乘积;其中,回退时间为机器的机器时钟与标准时钟之间的时间差,一般在几百毫秒内。例如,一个业务服务每天生成的订单量最多为1000万,机器的最大允许回退时间为0.4天,上述预设数量可以为400万,每个预设存储容器内的ID可以供业务服务使用大约0.4天。其中,上述业务服务可以为订单服务、用户服务、项目服务等左右需要生成全局唯一ID的服务。其中,在具体实现过程中,上述在至少两个预设存储容器中的每个预设存储容器内均生成预设数量的ID的具体实现方式为:通过SDK启动ID生成线程,依次在至少两个预设存储容器中的每个预设存储容器内生成预设数量的ID,从而确保后续取出的ID具有递增特性。
步骤22,在业务服务启动后,依次将至少两个预设存储容器作为当前读取容器,从当前读取容器内依次取出存储在当前读取容器内的ID,直至当前读取容器内的ID被读取完毕。
其中,在本发明的具体实施例中,可按照先生成先取出的方式,依次将至少两个预设存储容器作为当前读取容器,并按照先生成先取出的方式从当前读取容器内依次取出存储在当前读取容器内的ID,直至当前读取容器内的ID被读取完毕,从而确保取出的ID具有递增特性。
步骤23,在当前读取容器内的ID被取空时,往被取空的当前读取容器中再次生成预设数量的ID。
其中,在本发明的具体实施例中,在当前读取容器内的ID被取空时,需往被取空的当前读取容器中再次生成预设数量的ID,从而确保在业务服务的执行过程中,有足够的ID供业务服务使用。
其中,为便于理解,在此以两个预设存储容器、预设数量为400万为例,阐述上述分布式全局唯一ID生成方法的流程。具体的,假设两个预设存储容器分别为链表A和链表B,如图3所示,上述分布式全局唯一ID生成方法包括以下步骤:
步骤31,在业务服务的启动过程中,往链表A内生成400万个ID;
步骤32,往链表B内生成400万个ID,在业务服务启动后,执行步骤33;
步骤33,按照先入先出原则,依次从链表A内拿生成的ID;
步骤34,判断链表A是否为空,若是,则启动ID生成线程往链表A内生成400万个ID,并执行步骤35;若否,则执行步骤33;
步骤35,按照先入先出原则,依次从链表B内拿生成的ID;
步骤36,判断链表B是否为空,若是,则启动ID生成线程往链表B内生成400万个ID,并执行步骤33;若否,则执行步骤35。
从该实例中可知,因为有两个链表,其中一个链表被取完了之后,就去另外一个链表里面取,而此时又生成ID放入空链表里面,如果刚开始链表里面放了400万的ID数量,可以支撑业务服务用一段之间,并且这段时间也完全够时间将另一个链表放满。因此只要回退时间在最大允许回退时间之内就能保证生成全局唯一ID。
需要说明的是,当在至少两个预设存储容器中的一个预设存储容器内取ID,且该预设存储容器内的ID未被取完之前,若执行业务服务的机器发生时间回退,则从该预设存储容器内直接取ID即可,不需要生成新的ID,因此不会产生任何影响。另外即使回退的这段时间该预设存储容器内的ID被取完,需要往该预设存储容器内再次生成预设数量的ID,也不会有影响,因为该预设存储容器内的ID能支持业务服务使用一段时间,而机器回退的时间一般在几百毫秒内,所以此时的时间已经大于上次生成ID的时间,因此不会生成重复的ID。
由此可见,在本发明的具体实施例中,通过在业务服务的启动过程中,往至少两个预设存储容器中的每个预设存储容器内均生成预设数量的ID,并在业务服务启动后,依次将至少两个预设存储容器作为当前读取容器,从当前读取容器内依次取出存储在当前读取容器内的ID,直至当前读取容器内的ID被读取完毕,且在当前读取容器内的ID被取空时,往被取空的当前读取容器中再次生成预设数量的ID,使得在执行业务服务的机器发生时间回退时能生成全局唯一ID。
第三实施例
如图4所示,本发明的具体实施例提供了一种分布式全局唯一ID生成方法,包括:
步骤41,在业务服务的启动过程中,启动ID生成线程,依次在至少一个预设存储容器中的每个预设存储容器内生成预设数量的ID。
其中,在本发明的具体实施例中,在业务服务的启动过程中,SDK会启动ID生成线程依次在至少一个预设存储容器中的每个预设存储容器内生成预设数量的ID,以便在业务服务启动后,可以取生成的ID使用。
另外,在本发明的具体实施例中,上述预设存储容器主要用于存储生成的ID。具体的,上述预设存储容器可以为链表,优选双向链表。且在本发明的具体实施例中,可使用SnowFlake算法,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID,以确保生成的ID具有递增特性。具体的,上述ID包括1位标识位、41位毫秒级时间戳、10位机器ID和12位序列号。其中,41位毫秒级时间戳可以保证生成的ID保持递增特性,10位机器ID可以保证在不同的机器上生成不同的ID,实现分布式ID生成器,12位序列号能保证每毫秒生成4096个不同的序列号。需要说明的是,为确保后续取出的ID具有递增特性,上述预设存储容器还可以采用队列的结构实现,因为队列具有先进先出的特点,从而能确保后续取出的ID具有递增特性。
此外,在本发明的具体实施例中,上述预设数量可根据业务服务的场景决定,以确保执行业务服务的机器发生时间回退时能生成全局唯一ID。具体的,上述预设数量为业务服务每天所需ID的最大数量与执行业务服务的机器的最大允许回退时间的乘积;其中,回退时间为机器的机器时钟与标准时钟之间的时间差。其中,上述业务服务可以为订单服务、用户服务、项目服务等左右需要生成全局唯一ID的服务。
步骤42,在业务服务启动后,从至少一个预设存储容器中循环取出ID,并在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID。
其中,在本发明的具体实施例中,在业务服务启动后,当在至少一个预设存储容器中的一个预设存储容器内取ID,且该预设存储容器内的ID未被取完之前,若执行业务服务的机器发生时间回退,则从该预设存储容器内直接取ID即可,不需要生成新的ID,因此不会产生任何影响。另外即使回退的这段时间该预设存储容器内的ID被取完,需要往该预设存储容器内再次生成预设数量的ID,也不会有影响,因为该预设存储容器内的ID能支持业务服务使用一段时间,而机器回退的时间一般在几百毫秒内,所以此时的时间已经大于上次生成ID的时间,因此不会生成重复的ID。
可见,在本发明的具体实施例中,通过在业务服务的启动过程中,启动ID生成线程,依次在至少一个预设存储容器中的每个预设存储容器内生成预设数量的ID,并在业务服务启动后,从至少一个预设存储容器中循环取出ID,且在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID,使得在执行业务服务的机器发生时间回退时能生成全局唯一ID。
第四实施例
如图5所示,本发明的具体实施例提供了一种分布式全局唯一ID生成方法,包括:
步骤51,在业务服务的启动过程中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID。
其中,在本发明的具体实施例中,在业务服务的启动过程中,SDK会启动ID生成线程依次在至少一个预设存储容器中的每个预设存储容器内生成预设数量的ID,以便在业务服务启动后,业务线程可以调用SDK取生成的ID使用。
另外,在本发明的具体实施例中,上述预设存储容器主要用于存储生成的ID。具体的,上述预设存储容器可以为链表,优选双向链表。且在本发明的具体实施例中,可使用SnowFlake算法,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID,以确保生成的ID具有递增特性。具体的,上述ID包括1位标识位、41位毫秒级时间戳、10位机器ID和12位序列号。其中,41位毫秒级时间戳可以保证生成的ID保持递增特性,10位机器ID可以保证在不同的机器上生成不同的ID,实现分布式ID生成器,12位序列号能保证每毫秒生成4096个不同的序列号。需要说明的是,为确保后续取出的ID具有递增特性,上述预设存储容器还可以采用队列的结构实现,因为队列具有先进先出的特点,从而能确保后续取出的ID具有递增特性。
此外,在本发明的具体实施例中,上述预设数量可根据业务服务的场景决定,以确保执行业务服务的机器发生时间回退时能生成全局唯一ID。具体的,上述预设数量为业务服务每天所需ID的最大数量与执行业务服务的机器的最大允许回退时间的乘积;其中,回退时间为机器的机器时钟与标准时钟之间的时间差。其中,上述业务服务可以为订单服务、用户服务、项目服务等左右需要生成全局唯一ID的服务。
步骤52,在业务服务启动后,启动业务线程按照先生成先取出的方式从至少一个预设存储容器中循环取出ID,并在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID。
其中,在本发明的具体实施例中,在业务服务启动后,通过按照先生成先取出的方式从至少一个预设存储容器中循环取出ID,使得依次取出的ID全局唯一、且具有递增特性。
具体的,当在至少一个预设存储容器中的一个预设存储容器内取ID,且该预设存储容器内的ID未被取完之前,若执行业务服务的机器发生时间回退,则从该预设存储容器内直接取ID即可,不需要生成新的ID,因此不会产生任何影响。另外即使回退的这段时间该预设存储容器内的ID被取完,需要往该预设存储容器内再次生成预设数量的ID,也不会有影响,因为该预设存储容器内的ID能支持业务服务使用一段时间,而机器回退的时间一般在几百毫秒内,所以此时的时间已经大于上次生成ID的时间,因此不会生成重复的ID。
可见,在本发明的具体实施例中,通过在业务服务的启动过程中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID,并在业务服务启动后,启动业务线程按照先生成先取出的方式从至少一个预设存储容器中循环取出ID,且在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID,使得在执行业务服务的机器发生时间回退时能生成全局唯一ID。
第五实施例
如图6所示,本发明的具体实施例提供了一种分布式全局唯一ID生成设备,包括存储器61、处理器62以及存储在存储器61中并可在处理器62上运行的计算机程序63,该处理器62执行计算机程序63时实现上述的分布式全局唯一ID生成方法的步骤。
具体的,分布式全局唯一ID生成设备6的处理器62执行计算机程序63时实现以下步骤:在业务服务的启动过程中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID;在业务服务启动后,从至少一个预设存储容器中循环取出ID,并在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID。
可选地,预设存储容器的数量为至少两个,上述处理器62执行计算机程序63时还实现以下步骤:依次将至少两个预设存储容器作为当前读取容器,从当前读取容器内依次取出存储在当前读取容器内的ID,直至当前读取容器内的ID被读取完毕;在当前读取容器内的ID被取空时,往被取空的当前读取容器中再次生成预设数量的ID。
可选地,上述处理器62执行计算机程序63时还实现以下步骤:启动ID生成线程,依次在至少一个预设存储容器中的每个预设存储容器内生成预设数量的ID。
可选地,上述处理器62执行计算机程序63时还实现以下步骤:启动业务线程按照先生成先取出的方式从至少一个预设存储容器中循环取出ID。
可选地,上述处理器62执行计算机程序63时还实现以下步骤:使用SnowFlake算法,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID。
即,分布式全局唯一ID生成设备6的处理器62执行计算机程序63时实现上述的分布式全局唯一ID生成方法的步骤,能确保在执行业务服务的机器发生时间回退时生成全局唯一ID。
示例性的,上述分布式全局唯一ID生成设备6可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。该分布式全局唯一ID生成设备6可包括,但不仅限于处理器62、存储器61。本领域技术人员可以理解,所述示意图仅仅是分布式全局唯一ID生成设备6的示例,并不构成对分布式全局唯一ID生成设备6的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如分布式全局唯一ID生成设备6还可以包括输入输出设备、网络接入设备、总线等。
需要说明的是,由于分布式全局唯一ID生成设备的处理器执行计算机程序时实现上述的分布式全局唯一ID生成方法的步骤,因此上述方法的所有实施例均适用于该分布式全局唯一ID生成设备,且均能达到相同或相似的有益效果。
第六实施例
本发明的具体实施例提供了一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时实现上述的分布式全局唯一ID生成方法的步骤。
具体的,计算机程序被处理器执行时实现以下步骤:在业务服务的启动过程中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID;在业务服务启动后,从至少一个预设存储容器中循环取出ID,并在至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成预设数量的ID。
可选地,预设存储容器的数量为至少两个,上述计算机程序被处理器执行时还实现以下步骤:依次将至少两个预设存储容器作为当前读取容器,从当前读取容器内依次取出存储在当前读取容器内的ID,直至当前读取容器内的ID被读取完毕;在当前读取容器内的ID被取空时,往被取空的当前读取容器中再次生成预设数量的ID。
可选地,上述计算机程序被处理器执行时还实现以下步骤:启动ID生成线程,依次在至少一个预设存储容器中的每个预设存储容器内生成预设数量的ID。
可选地,上述计算机程序被处理器执行时还实现以下步骤:启动业务线程按照先生成先取出的方式从至少一个预设存储容器中循环取出ID。
可选地,上述计算机程序被处理器执行时还实现以下步骤:使用SnowFlake算法,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID。
即,计算机可读存储介质的计算机程序被处理器执行时实现上述的分布式全局唯一ID生成方法的步骤,能确保在执行业务服务的机器发生时间回退时生成全局唯一ID。
示例性的,计算机可读存储介质的计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。
需要说明的是,由于计算机可读存储介质的计算机程序被处理器执行时实现上述的分布式全局唯一ID生成方法的步骤,因此上述方法的所有实施例均适用于该计算机可读存储介质,且均能达到相同或相似的有益效果。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (8)
1.一种分布式全局唯一ID生成方法,其特征在于,包括:
在业务服务的启动过程中,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID;
在所述业务服务启动后,从所述至少一个预设存储容器中循环取出ID,并在所述至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成所述预设数量的ID;
所述预设存储容器的数量为至少两个;
所述从所述至少一个预设存储容器中循环取出ID,并在所述至少一个预设存储容器中存在ID被取空的预设存储容器时,往被取空的预设存储容器中再次生成所述预设数量的ID的步骤,包括:
依次将所述至少两个预设存储容器作为当前读取容器,从所述当前读取容器内依次取出存储在所述当前读取容器内的ID,直至当前读取容器内的ID被读取完毕;
在所述当前读取容器内的ID被取空时,往所述被取空的当前读取容器中再次生成所述预设数量的ID;
所述预设存储容器为链表。
2.根据权利要求1所述的方法,其特征在于,所述在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID的步骤,包括:
启动ID生成线程,依次在至少一个预设存储容器中的每个预设存储容器内生成预设数量的ID。
3.根据权利要求1所述的方法,其特征在于,所述从所述至少一个预设存储容器中循环取出ID的步骤,包括:
启动业务线程按照先生成先取出的方式从所述至少一个预设存储容器中循环取出ID。
4.根据权利要求1所述的方法,其特征在于,所述预设数量为所述业务服务每天所需ID的最大数量与执行所述业务服务的机器的最大允许回退时间的乘积;其中,所述回退时间为所述机器的机器时钟与标准时钟之间的时间差。
5.根据权利要求1所述的方法,其特征在于,所述ID包括1位标识位、41位毫秒级时间戳、10位机器ID和12位序列号。
6.根据权利要求1所述的方法,其特征在于,所述在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID的步骤,包括:
使用SnowFlake算法,在至少一个预设存储容器中的每个预设存储容器内均生成预设数量的ID。
7.一种分布式全局唯一ID生成设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至6任一项所述的分布式全局唯一ID生成方法的步骤。
8.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至6任一项所述的分布式全局唯一ID生成方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810481891.5A CN108804545B (zh) | 2018-05-18 | 2018-05-18 | 分布式全局唯一id生成方法及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810481891.5A CN108804545B (zh) | 2018-05-18 | 2018-05-18 | 分布式全局唯一id生成方法及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108804545A CN108804545A (zh) | 2018-11-13 |
CN108804545B true CN108804545B (zh) | 2022-07-08 |
Family
ID=64091220
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810481891.5A Active CN108804545B (zh) | 2018-05-18 | 2018-05-18 | 分布式全局唯一id生成方法及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108804545B (zh) |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109639775A (zh) * | 2018-11-27 | 2019-04-16 | 湖南蚁为软件有限公司 | 全局单调递增id生成方法、装置、系统及设备 |
CN111385370B (zh) * | 2018-12-28 | 2022-07-08 | 广州市百果园信息技术有限公司 | Id分配方法、装置、存储介质及id分配系统 |
CN109933609B (zh) * | 2019-01-30 | 2022-04-01 | 福建天泉教育科技有限公司 | 一种批量生成id的方法及终端 |
CN110096528A (zh) * | 2019-04-12 | 2019-08-06 | 中国银行股份有限公司 | 一种分布式系统中生成序列的方法、装置及系统 |
CN111831639B (zh) * | 2019-04-19 | 2024-01-30 | 北京车和家信息技术有限公司 | 一种全局唯一id生成方法及装置、车辆管理系统 |
CN110147281A (zh) * | 2019-05-15 | 2019-08-20 | 上海淇毓信息科技有限公司 | 优化雪花算法在金融业务中应用的方法、装置、电子设备 |
CN110543518B (zh) * | 2019-08-27 | 2022-10-25 | 北京奇艺世纪科技有限公司 | 一种分布式id生成方法、装置、设备及存储介质 |
CN110677511B (zh) * | 2019-09-29 | 2021-01-01 | 北京三快在线科技有限公司 | 分布式系统中的标识生成方法、装置、设备及存储介质 |
CN110830608B (zh) * | 2019-11-14 | 2021-06-15 | 腾讯科技(深圳)有限公司 | 一种全局唯一标识符生成方法、装置、设备及存储介质 |
CN111078693B (zh) * | 2019-11-29 | 2021-10-22 | 叮当快药科技集团有限公司 | 用于生成数据库记录主键的方法和装置 |
CN110991869A (zh) * | 2019-11-29 | 2020-04-10 | 交控科技股份有限公司 | 一种轨道信号设备管理方法 |
CN111291424B (zh) * | 2020-02-19 | 2023-03-24 | 望海康信(北京)科技股份公司 | 标识号生成方法、装置、计算机设备及存储介质 |
CN112231069B (zh) * | 2020-10-14 | 2024-12-27 | 北京金山云网络技术有限公司 | 事务标识的处理方法、装置及电子设备 |
CN112398929B (zh) * | 2020-11-04 | 2023-12-05 | 北京金和网络股份有限公司 | 基于容器的发号方法及发号器 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106570111A (zh) * | 2016-11-01 | 2017-04-19 | 浙江宇视科技有限公司 | 一种数据存储方法及存储服务器 |
CN107590173A (zh) * | 2017-07-28 | 2018-01-16 | 武汉市测绘研究院 | 二维时空地理信息在线回溯及对比方法 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7739312B2 (en) * | 2007-04-27 | 2010-06-15 | Network Appliance, Inc. | Data containerization for reducing unused space in a file system |
US8650155B2 (en) * | 2008-02-26 | 2014-02-11 | Oracle International Corporation | Apparatus and method for log based replication of distributed transactions using globally acknowledged commits |
US8412691B2 (en) * | 2010-09-10 | 2013-04-02 | International Business Machines Corporation | Maintenance and access of a linked list |
US20130191171A1 (en) * | 2012-01-19 | 2013-07-25 | National Railroad Passenger Corporation | Reservation container object and reference thereto |
CN104317749B (zh) * | 2014-10-31 | 2017-12-05 | 小米科技有限责任公司 | 信息写入方法和装置 |
CN106572165A (zh) * | 2016-10-26 | 2017-04-19 | 宜人恒业科技发展(北京)有限公司 | 一种分布式全局唯一id应用方法 |
CN107943828B (zh) * | 2017-10-18 | 2020-06-30 | 深圳市牛鼎丰科技有限公司 | 业务状态查询方法、装置、计算机设备和存储介质 |
-
2018
- 2018-05-18 CN CN201810481891.5A patent/CN108804545B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106570111A (zh) * | 2016-11-01 | 2017-04-19 | 浙江宇视科技有限公司 | 一种数据存储方法及存储服务器 |
CN107590173A (zh) * | 2017-07-28 | 2018-01-16 | 武汉市测绘研究院 | 二维时空地理信息在线回溯及对比方法 |
Also Published As
Publication number | Publication date |
---|---|
CN108804545A (zh) | 2018-11-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108804545B (zh) | 分布式全局唯一id生成方法及设备 | |
CN111722918A (zh) | 业务标识码生成方法、装置、存储介质及电子设备 | |
US9524318B2 (en) | Minimizing result set size when converting from asymmetric to symmetric requests | |
CN110928905B (zh) | 一种数据处理方法和装置 | |
CN112150023A (zh) | 任务分配方法、装置及存储介质 | |
CN106302780B (zh) | 集群设备批量传输数据的方法、装置及系统、服务器 | |
CN110147281A (zh) | 优化雪花算法在金融业务中应用的方法、装置、电子设备 | |
CN110888658B (zh) | 应用程序中功能模块的动态化方法、装置及存储介质 | |
CN105262680A (zh) | 一种应用于云存储系统的多线程nas网关 | |
CN104866339A (zh) | Fota数据的分布式持久化管理方法、系统和装置 | |
CN111966631A (zh) | 一种可快速分发的镜像文件生成方法、系统、设备和介质 | |
CN108255628A (zh) | 一种数据处理方法及装置 | |
CN110532111A (zh) | 高并发请求异步处理方法、装置、计算机设备及存储介质 | |
CN109213774B (zh) | 数据的存储方法及装置、存储介质、终端 | |
CN110781387A (zh) | 证券行情快照的推送方法、证券交易系统及存储介质 | |
CN113422808B (zh) | 物联网平台http信息推送方法、系统、装置及介质 | |
CN113836157A (zh) | 获取数据库增量数据的方法和装置 | |
US11194619B2 (en) | Information processing system and non-transitory computer readable medium storing program for multitenant service | |
CN108664322A (zh) | 数据处理方法及系统 | |
CN113760861B (zh) | 一种数据迁移的方法和装置 | |
CN111177109A (zh) | 一种删除过期键的方法和装置 | |
CN115454353A (zh) | 一种面向空间应用数据的高速写入及查询方法 | |
CN115237783A (zh) | 一种测试数据生成方法及装置 | |
CN110874268B (zh) | 数据处理方法、装置和设备 | |
CN112184027A (zh) | 任务进度更新方法、装置及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information | ||
CB02 | Change of applicant information |
Address after: 518000 R & D room 3501, block a, building 7, Vanke Cloud City Phase I, Xingke 1st Street, Xili community, Xili street, Nanshan District, Shenzhen City, Guangdong Province Applicant after: Tubatu Group Co.,Ltd. Address before: 1001-a, 10th floor, bike technology building, No.9, Keke Road, high tech Zone, Nanshan District, Shenzhen, Guangdong 518000 Applicant before: SHENZHEN BINCENT TECHNOLOGY Co.,Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |