System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind()
【技术实现步骤摘要】
本专利技术涉及互联网理财代销,尤其涉及一种分布式自增唯一id方法装置、设备及可读存储介质。
技术介绍
1、目前市场上已存在多种技术来实现分布式唯一id生成,如:snowflakealgorithm,该算法固定生成64bits的长整型id,并分多个组成部分;雪花算法具有简单、高性能、可扩展性的优点,但缺点是依赖系统时钟,可能会受到系统时间回拨的影响,进而无法保证唯一性,另外需要维护全局唯一的数据中心id和机器id,不适用于非常高的高并发场景,需要其他机制处理同一毫秒内的并发请求。uuid:通用唯一标志符是一种强大的标识符生成方式,生成长度为128bits,是一种旨在能够在分布式、多系统环境下生成难以预测且全球唯一的id生成算法。缺点是id较长,占用存储和传输资源,不适用于数据库存储,可能导致性能问题,不适用于排序和范围查询。第三方服务:即部署独立的全局唯一id生成服务,在分布式系统中所有的id消费者通过网络请求从独立的id生成服务中获取唯一id。其缺点是依赖外部服务,会引入额外的延迟和风险,可能需要独立部署,有硬件成本。
2、因为需要确保每笔交易都有唯一标志,保证交易对应的动账如扣款、返款需要保证唯一性,防止账务、交易数据的冲突和混淆,所以在理财代销领域唯一id非常重要。不过唯一性只是最基本的要求,理财代销领域的交易单id不止需要保证唯一性,还有其他的硬性及软性的要求,总体要求如下:
3、1.全局唯一性:生成的id必须在整个理财代销平台中保证全局唯一,以避免不同系统个、或节点间id冲突;
4、2
5、3.时钟回拨容忍度:系统需要能够处理时钟回拨,以确保在发生了时钟回拨时生成的id依然是全局唯一不重复;
6、4.业务可理解性:生成的id需要包含业务相关信息,以便在分析和调试时更容易理解和识别。
技术实现思路
1、为此,本专利技术提供了一种分布式自增唯一id方法装置、设备及可读存储介质用以克服现有技术中无法同时兼顾保证唯一性,适用于高并发场景,减少占用存储和传输资源,适用于数据库存储,适用于排序和范围查询,适用于跨多个数据库的唯一标志的问题。
2、为实现上述目的,本专利技术第一方面公开了一种分布式自增唯一id方法,所述方法包括,
3、步骤s1,采用构造或回调的方式完成初始化,初始化过程中自动根据主机名/ip查询数据库查询是否已配置应用id与机器名;
4、如果已配置应用id与机器名,且检测已配置的应用id与机器名符合编码要求,则使用已配置的应用id加机器名当做6位10进制机器编码;
5、如果已配置应用id与机器名,但检测已配置的应用id与机器名不符合编码要求,则:若id不足6位,左补0;若id多余6位则从最低位向最高位方向截取6位。
6、如果未配置应用id与机器名,则自动向表中新增一条数据,获取其id来当做机器编码。
7、步骤s2,初始化完成后,进行id生成流程:
8、具体而言,获取初始化生成的id,获取系统当前时间到毫秒级别,判定前次系统时间是否为空;
9、若判定前次时间为空,将系统当前时间赋值给前次时间;
10、若判定前次时间不为空,则判定当前系统时间减前次系统时间是否超过阈值;
11、进一步地,若判定当前系统时间减前次系统时间超过阈值,则进行抛出时钟回拨异常操作;
12、若判定当前系统时间减前次系统时间不超过阈值,则结束判定。
13、步骤s3,获取同一时间戳内发生的并发交易记录,根据所述发生的并发交易的次数计算得到累加值。
14、进一步地,判定累加值是否达到最大值;
15、若判定累加值达到最大值,则通过自旋不断重新获取当前最新时间,直到当前时间大于前次时间,将当前时间赋值给前次时间并且将累加值清零,使用累加值=0组装id,并将结果返回id
16、若判定累加值没有达到最大值,则进行累加值加1操作组装id,继续进行判定当前时间是否大于前次时间;
17、若判定结果为当前时间大于前次时间,则将当前时间赋值给前次时间,并且将累加值进行清零操作,并将结果返回id。
18、若判定结果为当前时间不大于前次时间,则直接将结果返回id。
19、进一步地,所述id生成过程中设置有异步线程id生成模式,将预生成id放入一个阻塞队列,当调用id生成时,从所述阻塞队列内部直接获取id并返回,所述异步线程id生成模式可根据需要选择是否启用。
20、进一步地,所述机器编码为固定值、依赖数据库自动生成的全局唯一值中的任一种。
21、本专利技术第二方面还提供了一种装置,包括,
22、初始化单元,用于完成初始化,所述初始化过程包括:获取主机名与主机ip,根据所述主机名或主机ip获取得到机器编码作为初始id;
23、id生成单元,用于进行id生成流程,获取系统当前时间,根据所述系统当前时间生成所述id的时间戳;获取同一时间戳内发生的并发交易记录,根据所述发生的并发交易的次数计算得到累加值;
24、id组合单元,用于将所述初始化单元得到的机器编码,所述id生成单元得到的时间戳及累加值进行排列组合,将组合后的结果返回id;
25、判定单元,用于对所述初始化单元、所述id生成单元、所述id组合单元执行流程过程中的判定程序进行判定。
26、进一步地,所述id生成单元设置有异步线程id生成模式,将预生成id放入一个阻塞队列,当调用id生成时,从所述阻塞队列内部直接获取id并返回,所述异步线程id生成模式可根据需要选择是否启用。
27、本专利技术第三方面提供了一种计算设备,包括:
28、存储器,用于存储程序指令;
29、处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行上述所述的一种分布式自增唯一id方法。
30、本专利技术第四方面还提供了一种计算机可读存储介质,包括计算机可读指令,当计算机读取并执行所述计算机可读指令时,实现如上述所述的一种分布式自增唯一id方法,所述可读介质可以为多个,所述多个可读介质相互之间能够独立运行。
31、与现有技术相比,本专利技术的有益效果在于;
32、1、通过时间戳及累加值的计算达到全局唯一性,本专利技术支持生成分布式全局唯一id;
33、2.不同部署环境适应性:多种部署环境的支持,如虚机或者docker环境;
34、3.分布式环境适应性:可以在分布式系统中轻松部署和管理,适用多节点、多数据中心的架构,有助于实现系统的水平扩展和容错;
35、4.分布式下的时间有序:本专利技术提供了分布式id的全局时间有序性本文档来自技高网...
【技术保护点】
1.一种分布式自增唯一ID方法,其特征在于,包括,
2.根据权利要求1所述的分布式自增唯一ID方法,其特征在于,所述初始化过程中自动根据主机名/IP查询数据库查询是否已配置应用ID与机器名;
3.根据权利要求1所述的分布式自增唯一ID方法,其特征在于,所述ID的时间戳根据所述系统当前时间顺序进行排序;
4.根据权利要求1所述的分布式自增唯一ID方法,其特征在于,所述步骤S3中计算得到的累加值,进一步判定累加值是否达到最大值;
5.根据权利要求1所述的分布式自增唯一ID方法,其特征在于,所述ID生成过程中设置有异步线程ID生成模式,将预生成ID放入一个阻塞队列,当调用ID生成时,从所述阻塞队列内部直接获取ID并返回,所述异步线程ID生成模式可根据需要选择是否启用。
6.根据权利要求1所述的分布式自增唯一ID方法,其特征在于,所述机器编码为固定值、依赖数据库自动生成的全局唯一值中的任一种。
7.一种装置,其特征在于,包括,
8.根据权利要求7所述的装置,其特征在于,所述ID生成单元设置有异步线程ID生
9.一种计算设备,其特征在于,包括:
10.一种计算机可读存储介质,其特征在于,包括计算机可读指令,当计算机读取并执行所述计算机可读指令时,实现如权利要求1至6中任一项方法,所述可读介质可以为多个,所述多个可读介质相互之间能够独立运行。
...【技术特征摘要】
1.一种分布式自增唯一id方法,其特征在于,包括,
2.根据权利要求1所述的分布式自增唯一id方法,其特征在于,所述初始化过程中自动根据主机名/ip查询数据库查询是否已配置应用id与机器名;
3.根据权利要求1所述的分布式自增唯一id方法,其特征在于,所述id的时间戳根据所述系统当前时间顺序进行排序;
4.根据权利要求1所述的分布式自增唯一id方法,其特征在于,所述步骤s3中计算得到的累加值,进一步判定累加值是否达到最大值;
5.根据权利要求1所述的分布式自增唯一id方法,其特征在于,所述id生成过程中设置有异步线程id生成模式,将预生成id放入一个阻塞队列,当调用id生成时,从所述阻塞队列内部直接获取id并返回,所述异步线程id生成模式可根据...
【专利技术属性】
技术研发人员:颜祎名,
申请(专利权)人:中信百信银行股份有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。