CN111414379A - 序列号生成方法、装置、设备及计算机可读存储介质 - Google Patents
序列号生成方法、装置、设备及计算机可读存储介质 Download PDFInfo
- Publication number
- CN111414379A CN111414379A CN202010206616.XA CN202010206616A CN111414379A CN 111414379 A CN111414379 A CN 111414379A CN 202010206616 A CN202010206616 A CN 202010206616A CN 111414379 A CN111414379 A CN 111414379A
- Authority
- CN
- China
- Prior art keywords
- serial number
- current
- sequence number
- service scene
- scene code
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及金融科技技术领域,公开了一种序列号生成方法、装置、设备及计算机可读存储介质。该序列号生成方法包括:在接收到序列号生成请求时,根据所述序列号生成请求获取业务场景码;从序列号缓存变量表中获取与所述业务场景码对应的当前序列号,其中,所述当前序列号是基于序列号数值表中与所述业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与所述业务场景码对应的区间大小更新得到的;基于所述当前序列号生成目标序列号。本发明通过从序列号缓存变量表中获取当前序列号,进而基于该当前序列号生成目标序列号,而无需在每次需要生成目标序列号时读取数据库,从而可减轻数据库压力,提升数据库性能。
Description
技术领域
本发明涉及金融科技(Fintech)技术领域,尤其涉及一种序列号生成方法、装置、设备及计算机可读存储介质。
背景技术
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,但由于金融行业的安全性、实时性要求,也对技术提出了更高的要求。
在分布式系统中,经常需要对大量消息、请求等进行唯一标识,这时就需要生成全局唯一序列号。目前生成序列号的方法包括UUID(Universally Unique Identifier,通用唯一识别码)算法、Flicker方案(基于MYSQL自增长机制实现的一种序列号生成方案)、Snowflake(雪花)算法等。但这些方案有诸多不足,例如,过分依赖数据库造成可用性较低,频繁访问数据库造成数据库压力较大、性能低下等。因此,亟需一种序列号的智能生成方法,以克服上述缺陷。
发明内容
本发明的主要目的在于提供一种序列号生成方法、装置、设备及计算机可读存储介质,旨在实现智能生成序列号,减轻数据库压力。
为实现上述目的,本发明提供一种序列号生成方法,所述序列号生成方法包括:
在接收到序列号生成请求时,根据所述序列号生成请求获取业务场景码;
从序列号缓存变量表中获取与所述业务场景码对应的当前序列号,其中,所述当前序列号是基于序列号数值表中与所述业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与所述业务场景码对应的区间大小更新得到的;
基于所述当前序列号生成目标序列号。
可选地,所述基于所述当前序列号生成目标序列号的步骤之前,还包括:
判断所述当前序列号是否为空;
若不为空,则执行步骤:基于所述当前序列号生成目标序列号。
可选地,所述判断所述当前序列号是否为空的步骤之后,还包括:
若为空,则根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
从所述序列号数值表中读取与所述业务场景码对应的当前序列号区间最大值,并从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小;
基于所述区间大小对所述当前序列号区间最大值进行更新,并基于所述当前序列号区间最大值对所述当前序列号进行更新;
在更新完成时,释放所述数据库行级锁,并基于更新后的当前序列号生成目标序列号。
可选地,所述基于所述当前序列号生成目标序列号的步骤包括:
从日期缓存变量表中获取与所述业务场景码对应的当前日期,并根据所述序列号生成请求获取分布式节点号和子系统号;
基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号。
可选地,所述基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号的步骤之前,还包括:
获取系统日期,并判断所述系统日期是否大于所述当前日期;
若所述系统日期小于或等于所述当前日期,则执行步骤:基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号。
可选地,所述判断所述系统日期是否大于所述当前日期的步骤之后,还包括:
若所述系统日期大于所述当前日期,则根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
将锁定后的序列号数值表和所述日期缓存变量表中的当前日期更新为所述系统日期;
从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小,将所述当前序列号区间最大值更新为所述区间大小,并将所述当前序列号更新为预设值;
在更新完成时,释放所述数据库行级锁;
所述基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号的步骤包括:
基于更新后的当前日期、所述分布式节点号、所述子系统号、所述业务场景码和更新后的当前序列号,按预设顺序组合生成目标序列号。
可选地,所述基于所述当前序列号生成目标序列号的步骤之后,还包括:
从所述序列号数值表中获取与所述业务场景码对应的当前序列号区间最大值;
判断所述当前序列号与所述当前序列号区间最大值是否相同;
若相同,则根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小,基于所述区间大小对所述当前序列号区间最大值进行更新,并基于所述当前序列号区间最大值对所述当前序列号进行更新;
在更新完成时,释放所述数据库行级锁。
可选地,所述判断所述当前序列号与所述当前序列号区间最大值是否相同的步骤之后,还包括:
若不相同,则基于预设递增值对所述当前序列号进行更新,以更新所述序列号缓存变量表。
此外,为实现上述目的,本发明还提供一种序列号生成装置,所述序列号生成装置包括:
第一获取模块,用于在接收到序列号生成请求时,根据所述序列号生成请求获取业务场景码;
第二获取模块,用于从序列号缓存变量表中获取与所述业务场景码对应的当前序列号,其中,所述当前序列号是基于序列号数值表中与所述业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与所述业务场景码对应的区间大小更新得到的;
第一生成模块,用于基于所述当前序列号生成目标序列号。
此外,为实现上述目的,本发明还提供一种序列号生成设备,所述序列号生成设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的序列号生成程序,所述序列号生成程序被所述处理器执行时实现如上所述的序列号生成方法的步骤。
此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有序列号生成程序,所述序列号生成程序被处理器执行时实现如上所述的序列号生成方法的步骤。
本发明提供一种序列号生成方法、装置、设备及计算机可读存储介质,在接收到序列号生成请求时,根据序列号生成请求获取业务场景码;从序列号缓存变量表中获取与业务场景码对应的当前序列号,其中,当前序列号是基于序列号数值表中与业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与业务场景码对应的区间大小更新得到的;基于当前序列号生成目标序列号。通过上述方式,可从数据库中获取一段序列号区间进行缓存,并通过序列号缓存变量表缓存当前序列号,当每次需要生成目标序列号时,可直接从序列号缓存变量表中获取当前序列号,进而基于该当前序列号生成目标序列号。当缓存中的序列号使用完毕后,会基于序列号数值表中与业务场景码对应的当前序列号区间最大值和序列号类型枚举类中与业务场景码对应的区间大小获取下一序列号区间,并更新当前序列号,而无需在每次需要生成目标序列号时读取一次数据库。因此,本发明相比于现有技术,无需频繁地访问数据库,可减轻数据库压力,提升数据库性能。此外,该序列号缓存变量表并非记录了一段序列号区间中的各序列号,而仅仅只需记录当前序列号即可,从而使得缓存占用内存空间较小。
附图说明
图1为本发明实施例方案涉及的硬件运行环境的设备结构示意图;
图2为本发明序列号生成方法第一实施例的流程示意图;
图3为本发明序列号生成装置第一实施例的功能模块示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
参照图1,图1为本发明实施例方案涉及的硬件运行环境的设备结构示意图。
本发明实施例序列号生成设备可以是智能手机,也可以是PC(PersonalComputer,个人计算机)、平板电脑、便携计算机等终端设备。
如图1所示,该序列号生成设备可以包括:处理器1001,例如CPU,通信总线1002,用户接口1003,网络接口1004,存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如Wi-Fi接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
本领域技术人员可以理解,图1中示出的序列号生成设备结构并不构成对序列号生成设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及序列号生成程序。
在图1所示的终端中,网络接口1004主要用于连接后台服务器,与后台服务器进行数据通信;用户接口1003主要用于连接客户端,与客户端进行数据通信;而处理器1001可以用于调用存储器1005中存储的序列号生成程序,并执行以下序列号生成方法的各个步骤。
基于上述硬件结构,提出本发明序列号生成方法的各实施例。
本发明提供一种序列号生成方法。
参照图2,图2为本发明序列号生成方法第一实施例的流程示意图。
在本实施例中,该序列号生成方法包括:
步骤S10,在接收到序列号生成请求时,根据所述序列号生成请求获取业务场景码;
本实施例的序列号生成方法是由序列号生成设备实现的,该设备搭载有序列号生成器,以该设备为服务器为例进行说明。
在本实施例中,当分布式系统中的某一计算节点(分布式节点)上的某一应用实例需要获取序列号时,会通过该应用实例上的线程进行竞争,最终一应用实例内只有一个线程可竞争得到,此时,当该应用实例内竞争成功的线程会进入同步方法,此时会触发序列号生成请求。对应的,服务器在接收到序列号生成请求时,根据该序列号生成请求获取业务场景码。其中,业务场景码是针对不同业务场景的一标识码。
步骤S20,从序列号缓存变量表中获取与所述业务场景码对应的当前序列号,其中,所述当前序列号是基于序列号数值表中与所述业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与所述业务场景码对应的区间大小更新得到的;
然后,从序列号缓存变量表中获取与该业务场景码对应的当前序列号。其中,序列号缓存变量表用于缓存多个不同业务场景的当前序列号,占用内存空间较小,其对应的缓存变量定义如下:
Static Map<SequenceType,Long>cacheSeqNo=new ConcurrentHashMap<SequenceType,Long>()。
该当前序列号是基于序列号数值表中与该业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与该业务场景码对应的区间大小更新得到的。具体的,当序列号缓存变量表中的当前序列号未达到当前序列号区间最大值时,即基于当前序列号区间最大值、区间大小、序列号历史生成次数更新得到当前序列号,该序列号缓存变量表中的当前序列号=当前序列号区间最大值-区间大小+序列号历史生成次数+1;当序列号缓存变量表中的当前序列号达到当前序列号区间最大值时,可获取下一序列号区间,此时,序列号缓存变量表中的当前序列号=当前序列号区间最大值+1。当然,可以理解,在具体实施时,该当前序列号是实时更新的,每生成一次目标序列号,对应会更新一次序列号缓存变量表中的当前序列号。其更新方式可以为上述方式,也可以直接在上一次的当前序列号上加上预设递增值1,以得到更新后的当前序列号。
其中,序列号数值表是用于存储不同业务场景码所对应的当前日期cur_date、当前序列号区间最大值cur_val的表格,序列号数值表的表结构如下:
序列号类型枚举类是用于存储不同业务场景码所对应的文字描述description、区间大小bufferSize的表格,序列号类型枚举类的表结构如下:
通过上述方式,可从数据库中获取一段序列号区间进行缓存,每次需要生成目标序列号时,可直接从序列号缓存变量表中获取当前序列号,进而基于当前序列号生成目标序列号。当缓存中的序列号使用完毕后,再基于当前序列号区间最大值和区间大小从数据库获取下一序列号区间,并更新当前序列号,而无需在每次需要生成目标序列号时读取一次数据库。因此,本实施例相比于现有技术,无需频繁地访问数据库,可减轻数据库压力,提升数据库性能。此外,序列号缓存变量表并非记录了一段序列号区间中的各序列号,而仅仅只需记录当前序列号即可,从而使得缓存占用内存空间较小。
步骤S30,基于所述当前序列号生成目标序列号。
在获取到当前序列号之后,基于当前序列号生成目标序列号。
作为目标序列号的其中一种生成方式,可直接将该当前序列号作为目标序列号。但是当应用于分布式系统时,为保证每一个分布式节点生成的序列号具有唯一性,可基于当前序列号和其他信息来生成目标序列号,例如,可以基于当前日期、分布式节点号、子系统号、业务场景码和当前序列号组合生成目标序列号,先从日期缓存变量表中获取与该业务场景码对应的当前日期,并根据序列号生成请求获取分布式节点号和子系统号,进而基于当前日期、分布式节点号、子系统号、业务场景码和当前序列号,按预设顺序组合生成目标序列号。具体的生成过程可参照下述第三实施例。
本发明实施例提供一种序列号生成方法,在接收到序列号生成请求时,根据序列号生成请求获取业务场景码;从序列号缓存变量表中获取与业务场景码对应的当前序列号,其中,当前序列号是基于序列号数值表中与业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与业务场景码对应的区间大小更新得到的;基于当前序列号生成目标序列号。通过上述方式,可从数据库中获取一段序列号区间进行缓存,并通过序列号缓存变量表缓存当前序列号,当每次需要生成目标序列号时,可直接从序列号缓存变量表中获取当前序列号,进而基于该当前序列号生成目标序列号。当缓存中的序列号使用完毕后,会基于序列号数值表中与业务场景码对应的当前序列号区间最大值和序列号类型枚举类中与业务场景码对应的区间大小获取下一序列号区间,并更新当前序列号,而无需在每次需要生成目标序列号时读取一次数据库。因此,本实施例相比于现有技术,无需频繁地访问数据库,可减轻数据库压力,提升数据库性能。此外,该序列号缓存变量表并非记录了一段序列号区间中的各序列号,而仅仅只需记录当前序列号即可,从而使得缓存占用内存空间较小。
进一步地,基于图2所示的第一实施例,提出本发明序列号生成方法的第二实施例。
在本实施例中,在上述步骤S30之前,该序列号生成方法还包括:
步骤A,判断所述当前序列号是否为空;
本实施例中,由于应用实例第一次启用或重启完毕时,对应序列号缓存变量表中的当前序列号cacheSeqNo为空,此时则无法生成目标序列号。因此,在获取到当前序列号之后,需先判断该当前序列号cacheSeqNo是否为空。
若不为空,则执行步骤S30:基于所述当前序列号生成目标序列号。
若当前序列号cacheSeqNo不为空,则可以基于当前序列号生成目标序列号。目标序列号的具体生成过程可参照上述第一实施例,此次不再赘述。
进一步地,在步骤A之后,若所述当前序列号为空,则执行步骤B:根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
步骤C,从所述序列号数值表中读取与所述业务场景码对应的当前序列号区间最大值,并从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小;
步骤D,基于所述区间大小对所述当前序列号区间最大值进行更新,并基于所述当前序列号区间最大值对所述当前序列号进行更新;
步骤E,在更新完成时,释放所述数据库行级锁,并基于更新后的当前序列号生成目标序列号。
进一步地,若当前序列号cacheSeqNo为空,则先根据业务场景码对序列号数值表施加数据库行级锁,以进行锁定。通过对序列号数值表施加数据库行级锁,保证同一分布式节点内,只有一个应用实例能访问序列号数值表(sys_sequence表)中该业务场景码对应的数据信息,等该实例访问结束,才允许其他应用实例访问该数据范围。在Java代码中可以使用spring事务和innoDB的for update方法实现数据库行级锁。具体的,施加数据库行级锁的执行命令可以为:SQL:select*from sys_sequence where name=SequenceType.namefor update。
然后,从序列号数值表中读取与该业务场景码对应的当前序列号区间最大值(记为CurVal),并从序列号类型枚举类中获取与业务场景码对应的区间大小(SequenceType.bufferSize);进而,基于区间大小对当前序列号区间最大值进行更新,并基于当前序列号区间最大值对当前序列号进行更新。具体的,在对当前序列号区间最大值进行更新时,可以基于如下执行命令:SQL:update sys_sequence set cur_val=CurVal+SequenceType.bufferSize where name=SequenceType.name。即将当前序列号区间最大值加上区间大小,得到更新后的当前序列号区间最大值。在对当前序列号进行更新时,即将当前序列号区间最大值CurVal加上1,将得到的CurVal+1作为更新后的当前序列号。
在更新完成时,释放数据库行级锁,以允许同一分布式节点内其他应用实例访问序列号数值表(sys_sequence表)中该业务场景码对应的数据信息,进而基于更新后的当前序列号生成目标序列号,即,先从日期缓存变量表中获取与该业务场景码对应的当前日期,并根据序列号生成请求获取分布式节点号和子系统号,然后,基于当前日期、分布式节点号、子系统号、业务场景码和更新后的当前序列号,按预设顺序组合生成目标序列号。
本实施例中,通过判断获取到的当前序列号是否为空,并在其为空时,通过预设规则对序列号缓存变量表中的当前序列号进行更新,进而基于更新后的当前学列号生成目标序列号,避免了在当前序列号为空时无法生成目标序列号的情形,即实现了应用实例第一次启用或重新启用时、仍可以智能生成目标序列号。
进一步地,基于上述第一实施例,提出本发明序列号生成方法的第三实施例。
在本实施例中,步骤S30包括:
步骤a1,从日期缓存变量表中获取与所述业务场景码对应的当前日期,并根据所述序列号生成请求获取分布式节点号和子系统号;
步骤a2,基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号。
作为目标序列号的另一种生成方式,可以基于当前日期+分布式节点号+子系统号+业务场景码+序列号的方式构成全局唯一的目标序列号。其生成过程如下:
先从日期缓存变量表中获取与该业务场景码对应的当前日期,并根据序列号生成请求获取分布式节点号和子系统号。其中,分布式节点号即为当前分布式节点所对应的标识号,日期缓存变量表用于缓存多个不同业务场景数据库中的当前日期,占用内存空间较小,其对应的缓存变量定义如下:
Static Map<SequenceType,String>cacheDate=new ConcurrentHashMap<SequenceType,String>()。
然后,基于当前日期、分布式节点号、子系统号、业务场景码和当前序列号,按预设顺序组合生成目标序列号。例如,若当前日期为20200101、分布式节点号为A01、子系统号为DP1、业务场景码为001、当前序列号为1234,可生成目标序列号为20200101A01DP10011234。
基于上述方式生成目标序列号,可使得该序列号生成方法支持分布式系统,保证各个分布式节点最终生成的目标序列号具有全局唯一性,且相同分布式节点内部生成的序列号依次递增,具备规则性。
进一步地,在上述步骤a2之前,该序列号生成方法还包括:
步骤a3,获取系统日期,并判断所述系统日期是否大于所述当前日期;
在本实施例中,由于目标序列号的生成依赖于当前日期,当应用实例的系统日期到达“下一天”(即系统日期大于当前日期)时,会影响目标序列号的生成。因此,在生成目标序列号之前,需检测系统日期大于当前日期。
具体的,获取系统日期,并判断系统日期是否大于当前日期。
若所述系统日期小于或等于所述当前日期,则执行步骤a2:基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号。
若系统日期小于当前日期,则说明存在时钟回拨问题、应用实例的系统日期回拨到之前日期了,但是由于目标序列号是基于当前日期生成的,系统日期回拨并不会导致重复目标序列号的生成,此时,可直接基于当前日期、分布式节点号、子系统号、业务场景码和当前序列号,按预设顺序组合生成目标序列号。若系统日期小于当前日期,则说明一切正常,则直接基于当前日期、分布式节点号、子系统号、业务场景码和当前序列号,按预设顺序组合生成目标序列号。
本实施例中,基于日期缓存变量表缓存当前日期,并基于该缓存的当前日期生成目标序列号,可避免现有技术时钟回拨(即应用实例的系统日期回拨到之前日期)时、导致生成重复目标序列号的情况。
进一步地,在上述步骤a3之后,若所述系统日期大于所述当前日期,则执行步骤a4:根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
步骤a5,将锁定后的序列号数值表和所述日期缓存变量表中的当前日期更新为所述系统日期;
步骤a6,从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小,将所述当前序列号区间最大值更新为所述区间大小,并将所述当前序列号更新为预设值;
步骤a7,在更新完成时,释放所述数据库行级锁;
若系统日期大于当前日期,此时,则需对序列号数值表和日期缓存变量表中的当前日期进行更新,同时需更新序列号数值表中的当前序列号区间最大值及序列号缓存变量表中的当前序列号。
具体的,先根据业务场景码对序列号数值表施加数据库行级锁,以进行锁定。通过对序列号数值表施加数据库行级锁,保证同一分布式节点内,只有一个应用实例能访问序列号数值表(sys_sequence表)中该业务场景码对应的数据信息,等该实例访问结束,才允许其他应用实例访问该数据范围。在Java代码中可以使用spring事务和innoDB的forupdate方法实现数据库行级锁。具体的,施加数据库行级锁的执行命令可以为:SQL:select*from sys_sequence where name=SequenceType.name for update。
然后,将锁定后的序列号数值表和日期缓存变量表中的当前日期更新为该系统日期,对应的执行命令为:SQL:update sys_sequence set cur_date=sysDate where name=SequenceType.name。进而从序列号类型枚举类中获取与该业务场景码对应的区间大小(SequenceType.bufferSize),将当前序列号区间最大值更新为区间大小,并将当前序列号更新为预设值。具体的,在对当前序列号区间最大值进行更新时,可以基于如下执行命令:SQL:update sys_sequence set cur_val=SequenceType.bufferSize where name=SequenceType.name,即将当前序列号区间最大值更新为该区间大小。在对当前序列号进行更新时,该预设值可选地设为,即将1作为更新后的当前序列号。
在更新完成时,释放数据库行级锁,以允许同一分布式节点内其他应用实例访问序列号数值表(sys_sequence表)中该业务场景码对应的数据信息。
此时,步骤a2包括:基于更新后的当前日期、所述分布式节点号、所述子系统号、所述业务场景码和更新后的当前序列号,按预设顺序组合生成目标序列号。
最后,基于更新后的当前日期、分布式节点号、子系统号、业务场景码和更新后的当前序列号,按预设顺序组合生成目标序列号。
本实施例可实现在系统日期更新至“下一天”时,智能更新序列号数值表和日期缓存变量表中的当前日期、序列号数值表的当前序列号区间最大值及序列号缓存变量表中的当前序列号,进而基于更新后的当前日期和当前序列号智能生成目标序列号。
进一步地,基于上述第一实施例,提出本发明序列号生成方法的第四实施例。
在本实施例中,在上述步骤S30之后,该序列号生成方法还包括:
步骤F,从所述序列号数值表中获取与所述业务场景码对应的当前序列号区间最大值;
在本实施例中,为便于下一线程获取到对应的目标序列号,可在本轮基于当前序列号生成目标序列号之后,对序列号缓存变量表中当前序列号进行更新。具体的更新过程如下:
先从序列号数值表中获取与业务场景码对应的当前序列号区间最大值,记为CurVal。
步骤G,判断所述当前序列号与所述当前序列号区间最大值是否相同;
然后,判断当前序列号与当前序列号区间最大值是否相同,以判断该缓存的序列号区间内的序列号是否已被用完。
若相同,则执行步骤H:根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
步骤I,从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小,基于所述区间大小对所述当前序列号区间最大值进行更新,并基于所述当前序列号区间最大值对所述当前序列号进行更新;
步骤J,在更新完成时,释放所述数据库行级锁。
若当前序列号与当前序列号区间最大值相同,则说明当前序列号区间内的序列号已被用完,此时则获取下一序列号区间段的序列号,同时更新序列号缓存变量表中当前序列号,具体的,先根据业务场景码对序列号数值表施加数据库行级锁,以进行锁定;通过对序列号数值表施加数据库行级锁,保证同一分布式节点内,只有一个应用实例能访问序列号数值表(sys_sequence表)中该业务场景码对应的数据信息,等该实例访问结束,才允许其他应用实例访问该数据范围。在Java代码中可以使用spring事务和innoDB的for update方法实现数据库行级锁。具体的,施加数据库行级锁的执行命令可以为:SQL:select*fromsys_sequence where name=SequenceType.name for update。
然后,从序列号类型枚举类中获取与业务场景码对应的区间大小(SequenceType.bufferSize),基于区间大小对当前序列号区间最大值进行更新,并基于当前序列号区间最大值对当前序列号进行更新。具体的,在对当前序列号区间最大值进行更新时,可以基于如下执行命令:SQL:update sys_sequence set cur_val=CurVal+SequenceType.bufferSize where name=SequenceType.name。即将当前序列号区间最大值加上区间大小,得到更新后的当前序列号区间最大值。在对当前序列号进行更新时,即将当前序列号区间最大值CurVal加上1,将得到的CurVal+1作为更新后的当前序列号。
在更新完成时,释放数据库行级锁,以允许同一分布式节点内其他应用实例访问序列号数值表(sys_sequence表)中该业务场景码对应的数据信息
进一步地,在步骤G之后,若所述当前序列号与所述当前序列号区间最大值不相同,则执行步骤K:基于预设递增值对所述当前序列号进行更新,以更新所述序列号缓存变量表。
若当前序列号与当前序列号区间最大值不相同,则说明当前序列号区间内的序列号还未被用完,此时,基于预设递增值对当前序列号进行更新,以更新序列号缓存变量表。其中,预设递增值可选地为1,对应的,更新后的当前序列号=当前序列号+1。
通过上述方式,本实施例可在本轮基于当前序列号生成目标序列号之后,对序列号缓存变量表中当前序列号进行更新,以便于下一线程获取到对应的目标序列号。
本发明还提供一种序列号生成装置。
参照图3,图3为本发明序列号生成装置第一实施例的功能模块示意图。
如图3所示,所述序列号生成装置包括:
第一获取模块10,用于在接收到序列号生成请求时,根据所述序列号生成请求获取业务场景码;
第二获取模块20,用于从序列号缓存变量表中获取与所述业务场景码对应的当前序列号,其中,所述当前序列号是基于序列号数值表中与所述业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与所述业务场景码对应的区间大小更新得到的;
第一生成模块30,用于基于所述当前序列号生成目标序列号。
进一步地,所述序列号生成装置还包括:
第一判断模块,用于判断所述当前序列号是否为空;
所述第一生成模块30具体用于若当前序列号不为空,则基于所述当前序列号生成目标序列号。
进一步地,所述序列号生成装置还包括:
第一锁定模块,用于若当前序列号为空,则根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
第三获取模块,用于从所述序列号数值表中读取与所述业务场景码对应的当前序列号区间最大值,并从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小;
第一更新模块,用于基于所述区间大小对所述当前序列号区间最大值进行更新,并基于所述当前序列号区间最大值对所述当前序列号进行更新;
第二生成模块,用于在更新完成时,释放所述数据库行级锁,并基于更新后的当前序列号生成目标序列号。
进一步地,所述第一生成模块30包括:
第一获取单元,用于从日期缓存变量表中获取与所述业务场景码对应的当前日期,并根据所述序列号生成请求获取分布式节点号和子系统号;
第一生成单元,用于基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号。
进一步地,所述第一生成模块30还包括:
第二获取单元,用于获取系统日期,并判断所述系统日期是否大于所述当前日期;
序列号生成单元,具体用于:若所述系统日期小于或等于所述当前日期,则基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号。
进一步地,所述第一生成模块30还包括:
第一锁定单元,用于若所述系统日期大于所述当前日期,则根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
第一更新单元,用于将锁定后的序列号数值表和所述日期缓存变量表中的当前日期更新为所述系统日期;
第二更新单元,用于从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小,将所述当前序列号区间最大值更新为所述区间大小,并将所述当前序列号更新为预设值;
锁释放单元,用于在更新完成时,释放所述数据库行级锁;
序列号生成单元,具体用于:基于更新后的当前日期、所述分布式节点号、所述子系统号、所述业务场景码和更新后的当前序列号,按预设顺序组合生成目标序列号。
进一步地,所述序列号生成装置还包括:
第四获取模块,用于从所述序列号数值表中获取与所述业务场景码对应的当前序列号区间最大值;
第二判断模块,用于判断所述当前序列号与所述当前序列号区间最大值是否相同;
第二锁定模块,用于若所述当前序列号与所述当前序列号区间最大值相同,则根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
第二更新模块,用于从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小,基于所述区间大小对所述当前序列号区间最大值进行更新,并基于所述当前序列号区间最大值对所述当前序列号进行更新;
锁释放模块,用于在更新完成时,释放所述数据库行级锁。
进一步地,所述序列号生成装置还包括:
第三更新模块,用于若不相同,则基于预设递增值对所述当前序列号进行更新,以更新所述序列号缓存变量表。
其中,上述序列号生成装置中各个模块的功能实现与上述序列号生成方法实施例中各步骤相对应,其功能和实现过程在此处不再一一赘述。
本发明还提供一种计算机可读存储介质,该计算机可读存储介质上存储有序列号生成程序,所述序列号生成程序被处理器执行时实现如以上任一项实施例所述的序列号生成方法的步骤。
本发明计算机可读存储介质的具体实施例与上述序列号生成方法各实施例基本相同,在此不作赘述。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (11)
1.一种序列号生成方法,其特征在于,所述序列号生成方法包括:
在接收到序列号生成请求时,根据所述序列号生成请求获取业务场景码;
从序列号缓存变量表中获取与所述业务场景码对应的当前序列号,其中,所述当前序列号是基于序列号数值表中与所述业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与所述业务场景码对应的区间大小更新得到的;
基于所述当前序列号生成目标序列号。
2.如权利要求1所述的序列号生成方法,其特征在于,所述基于所述当前序列号生成目标序列号的步骤之前,还包括:
判断所述当前序列号是否为空;
若不为空,则执行步骤:基于所述当前序列号生成目标序列号。
3.权利要求2所述的序列号生成方法,其特征在于,所述判断所述当前序列号是否为空的步骤之后,还包括:
若为空,则根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
从所述序列号数值表中读取与所述业务场景码对应的当前序列号区间最大值,并从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小;
基于所述区间大小对所述当前序列号区间最大值进行更新,并基于所述当前序列号区间最大值对所述当前序列号进行更新;
在更新完成时,释放所述数据库行级锁,并基于更新后的当前序列号生成目标序列号。
4.如权利要求1所述的序列号生成方法,其特征在于,所述基于所述当前序列号生成目标序列号的步骤包括:
从日期缓存变量表中获取与所述业务场景码对应的当前日期,并根据所述序列号生成请求获取分布式节点号和子系统号;
基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号。
5.如权利要求4所述的序列号生成方法,其特征在于,所述基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号的步骤之前,还包括:
获取系统日期,并判断所述系统日期是否大于所述当前日期;
若所述系统日期小于或等于所述当前日期,则执行步骤:基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号。
6.如权利要求5所述的序列号生成方法,其特征在于,所述判断所述系统日期是否大于所述当前日期的步骤之后,还包括:
若所述系统日期大于所述当前日期,则根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
将锁定后的序列号数值表和所述日期缓存变量表中的当前日期更新为所述系统日期;
从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小,将所述当前序列号区间最大值更新为所述区间大小,并将所述当前序列号更新为预设值;
在更新完成时,释放所述数据库行级锁;
所述基于所述当前日期、所述分布式节点号、所述子系统号、所述业务场景码和所述当前序列号,按预设顺序组合生成目标序列号的步骤包括:
基于更新后的当前日期、所述分布式节点号、所述子系统号、所述业务场景码和更新后的当前序列号,按预设顺序组合生成目标序列号。
7.如权利要求1所述的序列号生成方法,其特征在于,所述基于所述当前序列号生成目标序列号的步骤之后,还包括:
从所述序列号数值表中获取与所述业务场景码对应的当前序列号区间最大值;
判断所述当前序列号与所述当前序列号区间最大值是否相同;
若相同,则根据所述业务场景码对所述序列号数值表施加数据库行级锁,以进行锁定;
从所述序列号类型枚举类中获取与所述业务场景码对应的区间大小,基于所述区间大小对所述当前序列号区间最大值进行更新,并基于所述当前序列号区间最大值对所述当前序列号进行更新;
在更新完成时,释放所述数据库行级锁。
8.如权利要求7所述的序列号生成方法,其特征在于,所述判断所述当前序列号与所述当前序列号区间最大值是否相同的步骤之后,还包括:
若不相同,则基于预设递增值对所述当前序列号进行更新,以更新所述序列号缓存变量表。
9.一种序列号生成装置,其特征在于,所述序列号生成装置包括:
第一获取模块,用于在接收到序列号生成请求时,根据所述序列号生成请求获取业务场景码;
第二获取模块,用于从序列号缓存变量表中获取与所述业务场景码对应的当前序列号,其中,所述当前序列号是基于序列号数值表中与所述业务场景码对应的当前序列号区间最大值及序列号类型枚举类中与所述业务场景码对应的区间大小更新得到的;
第一生成模块,用于基于所述当前序列号生成目标序列号。
10.一种序列号生成设备,其特征在于,所述序列号生成设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的序列号生成程序,所述序列号生成程序被所述处理器执行时实现如权利要求1至8中任一项所述的序列号生成方法的步骤。
11.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有序列号生成程序,所述序列号生成程序被处理器执行时实现如权利要求1至8中任一项所述的序列号生成方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010206616.XA CN111414379A (zh) | 2020-03-20 | 2020-03-20 | 序列号生成方法、装置、设备及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010206616.XA CN111414379A (zh) | 2020-03-20 | 2020-03-20 | 序列号生成方法、装置、设备及计算机可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111414379A true CN111414379A (zh) | 2020-07-14 |
Family
ID=71493152
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010206616.XA Pending CN111414379A (zh) | 2020-03-20 | 2020-03-20 | 序列号生成方法、装置、设备及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111414379A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112559558A (zh) * | 2020-12-07 | 2021-03-26 | 北京理房通支付科技有限公司 | 一种流水号生成方法和装置、计算设备和存储介质 |
CN112612790A (zh) * | 2020-12-17 | 2021-04-06 | 深圳前海微众银行股份有限公司 | 卡号配置方法、装置、设备及计算机存储介质 |
CN112948399A (zh) * | 2021-05-17 | 2021-06-11 | 太平金融科技服务(上海)有限公司深圳分公司 | 序列号生成方法、装置、计算机设备和存储介质 |
CN114281872A (zh) * | 2022-03-07 | 2022-04-05 | 广联达科技股份有限公司 | 分布式序列号的生成方法、装置、设备及可读存储介质 |
CN115174527A (zh) * | 2022-07-12 | 2022-10-11 | 腾讯科技(深圳)有限公司 | 序列号处理方法和装置、计算设备、存储介质 |
CN116186796A (zh) * | 2023-02-21 | 2023-05-30 | 中国人民解放军海军工程大学 | 序列号生成方法、系统、电子设备及存储介质 |
-
2020
- 2020-03-20 CN CN202010206616.XA patent/CN111414379A/zh active Pending
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112559558A (zh) * | 2020-12-07 | 2021-03-26 | 北京理房通支付科技有限公司 | 一种流水号生成方法和装置、计算设备和存储介质 |
CN112559558B (zh) * | 2020-12-07 | 2024-04-09 | 北京理房通支付科技有限公司 | 一种流水号生成方法和装置、计算设备和存储介质 |
CN112612790A (zh) * | 2020-12-17 | 2021-04-06 | 深圳前海微众银行股份有限公司 | 卡号配置方法、装置、设备及计算机存储介质 |
CN112948399A (zh) * | 2021-05-17 | 2021-06-11 | 太平金融科技服务(上海)有限公司深圳分公司 | 序列号生成方法、装置、计算机设备和存储介质 |
CN112948399B (zh) * | 2021-05-17 | 2021-08-03 | 太平金融科技服务(上海)有限公司深圳分公司 | 序列号生成方法、装置、计算机设备和存储介质 |
CN114281872A (zh) * | 2022-03-07 | 2022-04-05 | 广联达科技股份有限公司 | 分布式序列号的生成方法、装置、设备及可读存储介质 |
CN114281872B (zh) * | 2022-03-07 | 2022-05-24 | 广联达科技股份有限公司 | 分布式序列号的生成方法、装置、设备及可读存储介质 |
CN115174527A (zh) * | 2022-07-12 | 2022-10-11 | 腾讯科技(深圳)有限公司 | 序列号处理方法和装置、计算设备、存储介质 |
CN115174527B (zh) * | 2022-07-12 | 2024-02-13 | 腾讯科技(深圳)有限公司 | 序列号处理方法和装置、计算设备、存储介质 |
CN116186796A (zh) * | 2023-02-21 | 2023-05-30 | 中国人民解放军海军工程大学 | 序列号生成方法、系统、电子设备及存储介质 |
CN116186796B (zh) * | 2023-02-21 | 2024-01-30 | 中国人民解放军海军工程大学 | 序列号生成方法、系统、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111414379A (zh) | 序列号生成方法、装置、设备及计算机可读存储介质 | |
CN107943594B (zh) | 数据获取方法和装置 | |
CN110109958B (zh) | 缓存处理方法、装置、设备及计算机可读存储介质 | |
CN113010224B (zh) | 前端微服务化方法、装置、计算机设备和存储介质 | |
CN112860953A (zh) | 图数据库的数据导入方法、装置、设备及存储介质 | |
CN114780615A (zh) | 错误码管理方法及其装置 | |
CN109271193B (zh) | 一种数据处理方法、装置、设备及存储介质 | |
CN112783866B (zh) | 数据读取方法、装置、计算机设备和存储介质 | |
CN112328325A (zh) | 模型文件的执行方法、装置、终端设备及存储介质 | |
CN112596820A (zh) | 一种资源加载方法、装置、设备以及存储介质 | |
CN108629003B (zh) | 内容加载方法与装置 | |
CN108961351B (zh) | 通过压缩实现分形图绘制的方法、设备、系统及存储介质 | |
CN112416410A (zh) | 小程序的数据管理方法、装置、计算机设备和存储介质 | |
CN112068899A (zh) | 插件加载方法、装置、电子设备及存储介质 | |
CN113900959B (zh) | 软件测试方法、装置、设备及存储介质 | |
CN114036190A (zh) | 缓存控制方法、装置、设备及可读存储介质 | |
CN113111012B (zh) | 一种应用数据定位器生成方法及应用数据定位方法 | |
CN110019289B (zh) | 一种数据查询方法、装置及电子设备 | |
CN110968460B (zh) | 系统崩溃状态下网址恢复的方法和装置 | |
CN115455055A (zh) | 数据编号方法、装置、系统、电子装置和存储介质 | |
CN116894044A (zh) | 数据管理方法、装置、计算机设备和存储介质 | |
CN118445841A (zh) | 一种数据脱敏处理方法、系统、设备和介质 | |
CN118295795A (zh) | 字符串调用方法、装置、电子设备、存储介质 | |
CN116048468A (zh) | 加载缓存数据和数据处理的方法、装置、电子设备及介质 | |
CN114817285A (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 |