UUID、雪花算法保证分布式高并发电商系统订单号唯一
引言
在电商系统中,生成唯一的订单号至关重要,这关系到订单的准确追踪、管理和查询。
常用方法
1、数据库自增
原理:在数据库中给某个列设置为自增列,并且给该列设置一个初始值。每当有新的订单生成时,该列的值会自动增加,从而确保每个订单都有一个唯一的编号。
优点:实现简单,易于理解和维护。
缺点:在分布式系统或高并发环境下,数据库自增方式可能会遇到性能瓶颈,且当数据库进行分库分表时,订单号可能会重复。
2、UUID(通用唯一识别码)
原理:UUID按照开放软件基金会(OSF)指定的标准进行计算,用到了以太网卡地址(MAC)、纳秒级时间、芯片ID码等,确保每个生成的UUID都是唯一的。
优点:全局唯一,生成简单。
缺点:可读性差,数据库查询效率较低,且UUID通常较长,不利于用户记忆和存储。
3、雪花算法(Snowflake)
原理:Twitter开源的分布式ID生成算法,可以产生64位的ID。其中第一位是固定的正数标识,41位用于存储时间戳,剩下的为机器ID和序列号。通过时间戳、机器ID和序列号的组合,确保每个ID都是唯一的。
优点:生成速度快,全局唯一,适用于分布式系统和高并发环境。
缺点:生成的ID较长,不利于用户记忆和存储。
4、时间戳+随机数/自增长数字
原理:使用时间戳作为基础,然后加上随机数或自增长数字来确保唯一性。例如,“2023102912345678”(时间戳)+“987654”(随机数)或自增长数字。
优点:生成简单,可读性强(包含时间信息)。
缺点:在极端情况下(如高并发、大量订单生成时),可能会存在重复的风险。因此,需要确保随机数或自增长数字的位数足够长,以降低重复的概率。
5、自定义规则
原理:根据业务需求自定义订单号的生成规则。例如,可以使用“字母+数字”的组合方式,其中字母代表特定的业务含义(如订单类型、支付类型等),数字则用于确保唯一性。
优点:灵活性强,可以根据业务需求进行定制。
缺点:需要确保自定义规则的复杂性和唯一性足够高,以避免重复和冲突。同时,自定义规则可能不利于后续的维护和扩展。
UUID介绍
UUID(Universally Unique Identifier,通用唯一识别码)是一种软件建构的标准,也是被开放软件基金会(OSF)的分布式计算环境(DCE)所采纳。UUID的目的是让分布式系统中的所有元素都能有唯一的识别信息,而不需要通过中央控制端来分配。
UUID由一组32个十六进制的数字组成(总共36个字符,包括4个连字符),通常被表示为8-4-4-4-12的形式,分为五段,形式为:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx,其中M表示UUID的版本,N为UUID的变体(Variants)。
UUID的例子:
123e4567-e89b-12d3-a456-426614174000
这是一个标准的UUID格式,用于唯一标识某个对象或实体。
在实际应用中,UUID的具体值是由算法生成的,确保在全球范围内是唯一的(尽管存在极小的碰撞概率)。UUID广泛应用于数据库、软件、互联网等领域,用于确保数据的唯一性和一致性。
需要注意的是,虽然UUID的格式是固定的,但具体的值(即那些十六进制数字)是随机生成的,因此每次生成的UUID都是不同的(除非是通过相同的算法和相同的输入参数生成的)。
雪花算法介绍
雪花算法(Snowflake Algorithm)是Twitter开源的一种分布式唯一ID生成算法,它生成的ID并不是传统意义上的字符串,而是一个64位的长整型数字。这个64位的数字被划分为多个部分,每个部分都有其特定的含义。
以下是雪花算法生成的ID的详细结构和几个例子:
1、雪花算法ID的结构
1、符号位(1位):最高位是符号位,始终为0,这保证了生成的ID为正数。
2、时间戳(41位):接下来的41位用于存储生成ID的时间戳,单位是毫秒。这41位可以表示的数字多达2^41-1个毫秒值,换算成年就是大约69年的时间。
3、机器ID(10位):再接下来的10位用于标识不同的机器或数据中心。这10位可以进一步细分为机房ID(5位)和机器ID(5位),但具体划分可以根据实际需求来调整。不过,总的机器ID位数是10位,这意味着最多可以支持1024台机器(2^10)。
4、序列号(12位):最后的12位用于标识在同一毫秒内生成的不同ID。这12位可以表示的最大正整数是4095(2^12-1),也就是说,可以用这个12位的数字来区分同一个毫秒内的4096个不同的ID。
2、雪花算法的示例
以下是几个雪花算法生成的结果(ID)示例,这些ID是64位的长整型数字,在十进制下的表示:
ID示例1:
十进制表示:6878880016384942081
备注:这个ID是假设在某个特定时间戳、某个特定机器ID(如1)和某个序列号(如1)下生成的。
ID示例2:
十进制表示:6878880016384942082
备注:这个ID与示例1几乎相同,但序列号增加了1,表示在同一毫秒内紧接着生成的下一个ID。
ID示例3:
十进制表示:6878880016385786881
备注:这个ID与示例1和示例2在时间戳上有所不同(假设是下一毫秒),机器ID相同,序列号为1,表示在新的一毫秒内生成的第一个ID。
ID示例4:
十进制表示:6878880017418326017
备注:这个ID与前面的示例在时间戳和机器ID上都有所不同,表示在不同时间、不同机器上生成的ID。
上述ID示例是假设性的,实际生成的雪花算法ID将取决于生成时的具体时间戳、机器ID配置和序列号。由于雪花算法生成的ID是全局唯一的,因此在实际应用中,每个ID都是独一无二的,不会与其他ID重复。
另外,由于雪花算法生成的ID包含了时间戳信息,因此它们还具有时间有序性,即可以按照ID的大小来判断生成的时间先后顺序。这一特性使得雪花算法在分布式系统中具有广泛的应用价值。
3、雪花算法的二进制与十进制
雪花算法生成的结果是64位的长整型数字,这是指其在二进制形式下的位数。然而,当将这些二进制数字转换为十进制表示时,其长度并不是固定的64位数字,而是取决于该二进制数字在十进制下的具体值。
在二进制系统中,一个64位的数字可以表示的最大值是2^64-1,这是一个非常大的数。但是,在十进制系统中,这个数会被表示为一个远少于64位的数字(尽管其实际值仍然是一个64位二进制数所能表示的范围内的数)。例如,二进制数“1111111111111111111111111111111111111111”(64个1)在十进制下表示为“18446744073709551615”,这是一个19位的十进制数。
因此,在理论上,一个64位的二进制数可以表示的最大值是2^64-1,即18446744073709551615。这个数在十进制下是一个19位的数字。但是,雪花算法生成的ID并不会每次都达到这个最大值,因此其十进制表示的长度通常会小于19位。
总结
雪花算法在正常情况下能够高效地生成全局唯一的ID。然而,在极端情况下(如时钟回拨、序列号溢出或网络分区等),理论上仍然存在生成重复ID的可能性。因此,在使用雪花算法时,需要充分考虑这些潜在风险,并采取相应的措施来降低重复ID的概率。
版权声明:本文为原创文章,版权归 本站 所有,未经许可,不得转载。
本文地址:https://www.yiisu.vip/orderid_unique.html
如对本文有疑问可在评论区留言,博主会尽力解答,同时欢迎关注微信公众号“云计算课代表”。