CN114756589A - 单据编号生成方法、装置和计算机设备 - Google Patents
单据编号生成方法、装置和计算机设备 Download PDFInfo
- Publication number
- CN114756589A CN114756589A CN202210435208.0A CN202210435208A CN114756589A CN 114756589 A CN114756589 A CN 114756589A CN 202210435208 A CN202210435208 A CN 202210435208A CN 114756589 A CN114756589 A CN 114756589A
- Authority
- CN
- China
- Prior art keywords
- segment
- database
- target
- document
- upper limit
- 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
- G06F16/2455—Query execution
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请涉及一种单据编号生成方法、装置和计算机设备。所述方法包括:接收目标单据的编号生成请求,并向内存数据库发送所述目标单据的关键词;当所述内存数据库存在与所述关键词对应的历史编号时,在第一号段范围内对所述历史编号进行自增处理,得到目标编号;当所述目标编号大于所述第一号段对应的上限编号时,向持久化数据库发送号段更新请求;所述内存数据库根据所述持久化数据库返回的号段更新命令对所述第一号段进行更新,得到第二号段;将所述第二号段中的起始编号作为单据编号返回。采用本方法能够及时响应编号请求。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种单据编号生成方法、装置和计算机设备。
背景技术
随着计算机技术的发展,在企业相关的系统或平台中存在海量单据,当不同单据需存储入库时,为了区分不同的单据,通常是对不同的单据进行编号,单据的编号用于标识一个单据。传统的方式主要采用传统数据库,如关系型数据库MySQL、Oracle Database等进行单据编号,先对单据编号进行查询,再对查询到的单据编号进行更新,在高并发场景中,单据编号期间往往使用分布式锁来避免重复编号,由此使得整个编号流程串行化,一次响应编号完成才能进行下次编号,这过程中可能被其他请求阻塞。故而现有技术手段,在高并发场景存在响应编号请求不及时的问题。
发明内容
基于此,有必要针对上述技术问题,提供一种能够解决响应编号请求不及时问题的单据编号生成方法、装置和计算机设备。
第一方面,本申请提供了一种单据编号生成方法。所述方法包括:
接收目标单据的编号生成请求,并向内存数据库发送所述目标单据的关键词;
当所述内存数据库存在与所述关键词对应的历史编号时,在第一号段范围内对所述历史编号进行自增处理,得到目标编号;
当所述目标编号大于所述第一号段对应的上限编号时,向持久化数据库发送号段更新请求;
所述内存数据库根据所述持久化数据库返回的号段更新命令对所述第一号段进行更新,得到第二号段;
将所述第二号段中的起始编号作为单据编号返回。
在其中一个实施例中,所述向内存数据库发送所述目标单据的关键词之前,所述方法还包括:
确定所述目标单据对应的编号规则;
获取到所述目标单据对应的编号规则标识;
根据所述编号规则标识形成所述目标单据的关键词。
在其中一个实施例中,所述方法还包括:
当所述内存数据库中不存在所述目标单据的关键词、且所述持久化数据库中不存在号段表,或不存在与所述关键词对应的历史编号、且所述持久化数据库中不存在号段表时,则判定处于初始化状态;
在所述初始化状态下,通过所述内存数据库向所述持久化数据库发出检索编号请求,以使所述持久化数据库创建第三号段;
通过所述内存数据库将所述第三号段中起始编号作为所述单据编号。
在其中一个实施例中,所述方法还包括:
当所述内存数据库中不存在所述目标单据的关键词、且所述持久化数据库中存在号段表,或不存在与所述关键词对应的历史编号、且所述持久化数据库中存在号段表时,则判定处于宕机状态;
在所述宕机状态下,通过所述持久化数据库获取号段表中的历史上限编号和号段步长;
对所述历史上限编号自增得到号段起始编号,以及对所述历史上限编号增加所述号段步长得到号段上限编号;
依据所述号段起始编号和所述号段上限编号确定第四号段;
通过所述内存数据库将所述第四号段中的起始编号作为所述单据编号。
在其中一个实施例中,所述方法还包括:
当所述目标编号不大于所述上限编号且等于预设阈值时,则判定处于预热状态;在所述预热状态下,通过所述内存数据库向所述持久化数据库的持久化数据库发出检索编号请求,以使所述持久化数据库基于所述持久化数据库的号段表创建第五号段;通过所述内存数据库将所述第五号段中的上限编号对所述第一号段对应的上限编号进行更新;
当所述目标编号不大于所述第一号段对应的上限编号且不等于所述预设阈值时,将所述目标编号作为单据编号返回。
在其中一个实施例中,所述当所述目标编号大于所述第一号段对应的上限编号时,向持久化数据库发送号段更新请求之后,所述方法还包括:
持久化数据库获取第一分布式锁;
所述持久化数据库基于所述第一分布式锁和所述持久化数据库的号段表创建第二号段。
第二方面,本申请还提供了一种单据编号生成装置。所述装置包括:
接受与发送模块,用于接收目标单据的编号生成请求,并向内存数据库发送所述目标单据的关键词;
自增模块,用于当所述内存数据库存在与所述关键词对应的历史编号时,在第一号段范围内对所述历史编号进行自增处理,得到目标编号;
发送模块,用于当所述目标编号大于所述第一号段对应的上限编号时,向持久化数据库发送号段更新请求;
更新模块,用于所述内存数据库根据所述持久化数据库返回的号段更新命令对所述第一号段进行更新,得到第二号段
返回模块,用于将所述第二号段中的起始编号作为单据编号返回。
在其中一个实施例中,所述接受与发送模块还用于确定所述目标单据对应的编号规则;获取到所述目标单据对应的编号规则标识;根据所述编号规则标识形成所述目标单据的关键词。
在其中一个实施例中,所述装置还包括:
初始化模块,用于当所述内存数据库中不存在所述目标单据的关键词、且所述持久化数据库中不存在号段表,或不存在与所述关键词对应的历史编号、且所述持久化数据库中不存在号段表时,则判定处于初始化状态;在所述初始化状态下,通过所述内存数据库向所述持久化数据库发出检索编号请求,以使所述持久化数据库创建第三号段;通过所述内存数据库将所述第三号段中起始编号作为所述单据编号。
在其中一个实施例中,所述装置还包括:
宕机模块,用于当所述内存数据库中不存在所述目标单据的关键词、且所述持久化数据库中存在号段表,或不存在与所述关键词对应的历史编号、且所述持久化数据库中存在号段表时,则判定处于宕机状态;在所述宕机状态下,通过所述持久化数据库获取号段表中的历史上限编号和号段步长;对所述历史上限编号自增得到号段起始编号,以及对所述历史上限编号增加所述号段步长得到号段上限编号;依据所述号段起始编号和所述号段上限编号确定第四号段;通过所述内存数据库将所述第四号段中的起始编号作为所述单据编号。
在其中一个实施例中,所述发送模块还用于当所述目标编号不大于所述上限编号且等于预设阈值时,则判定处于预热状态;在所述预热状态下,通过所述内存数据库向所述持久化数据库的持久化数据库发出检索编号请求,以使所述持久化数据库基于所述持久化数据库的号段表创建第五号段;通过所述内存数据库将所述第五号段中的上限编号对所述第一号段对应的上限编号进行更新;当所述目标编号不大于所述第一号段对应的上限编号且不等于所述预设阈值时,将所述目标编号作为单据编号返回。
在其中一个实施例中,所述更新模块还用于持久化数据库获取第一分布式锁;所述持久化数据库基于所述第一分布式锁和所述持久化数据库的号段表创建第二号段。
第三方面,本申请还提供了一种计算机设备。所述计算机设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述方法的步骤。
第四方面,本申请还提供了一种计算机可读存储介质。所述计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤。
第五方面,本申请还提供了一种计算机程序产品。所述计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述方法的步骤。
上述单据编号生成方法、装置和计算机设备,通过接收目标单据的编号生成请求,并向内存数据库发送目标单据的关键词;当内存数据库存在与关键词对应的历史编号时,在第一号段范围内对历史编号进行自增处理,得到目标编号;高效快捷的生成编号,解决了响应编号请求不及时的问题。不仅如此,还通过当目标编号大于第一号段对应的上限编号时,向持久化数据库发送号段更新请求;内存数据库根据持久化数据库返回的号段更新命令对第一号段进行更新,得到第二号段;将第二号段中的起始编号作为单据编号返回,实现了依据分段式的号段进行单据编号。本发明解决了在高并发场景下现有技术单据编号响应不及时的问题,通过创新的内存数据库和持久化数据库之间的编号架构设计,极大的提升了单据编号效率,在高并发下也具有毫秒级的编号响应时延,特别适用于高并发编号的业务场景。
附图说明
图1为一个实施例中单据编号生成方法的应用环境图;
图2为一个实施例中单据编号生成方法的流程示意图;
图3为一个实施例中单据编号生成方法的原理示意图;
图4为一个实施例中内存数据库的自增编号的原理示意图;
图5为另一个实施例中单据编号生成方法流程示意图;
图6为一个实施例中单据编号生成步骤的应用流程图;
图7为一个实施例中预热状态下单据编号生成步骤的应用流程图;
图8为一个实施例中临界状态下单据编号生成方法应用流程图;
图9为一个实施例中初始化步骤的流程示意图;
图10为一个实施例中宕机状态下单据编号生成步骤的应用流程图;
图11为一个实施例中初始化状态下的单据编号生成步骤应用流程图;
图12为一个实施例中单据编号生成装置的结构框图;
图13为一个实施例中单据编号生成装置的结构框图;
图14为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请实施例提供的单据编号生成方法,可以应用于如图1所示的应用环境中。其中,终端102通过网络与服务器104进行通信。数据存储系统可以存储服务器104需要处理的数据。数据存储系统可以集成在服务器104上,也可以放在云上或其他网络服务器上。本实施例以服务器104执行为例进行说明。
服务器104接收目标单据的编号生成请求,并向内存数据库发送目标单据的关键词;服务器104当内存数据库存在与关键词对应的历史编号时,在第一号段范围内对历史编号进行自增处理,得到目标编号;服务器104当目标编号大于第一号段对应的上限编号时,向持久化数据库发送号段更新请求;服务器104内存数据库根据持久化数据库返回的号段更新命令对第一号段进行更新,得到第二号段;服务器104将第二号段中的起始编号作为单据编号返回。
其中,终端102可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑、物联网设备和便携式可穿戴设备,物联网设备可为智能音箱、智能电视、智能空调、智能车载设备等。便携式可穿戴设备可为智能手表、智能手环、头戴设备等。服务器104可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
在一个实施例中,如图2所示,提供了一种单据编号生成方法,以该方法应用于图1中的服务器104为例进行说明,包括以下步骤:
S202,接收目标单据的编号生成请求,并向内存数据库发送目标单据的关键词。
其中,目标单据可以指需要生成编号的单据。内存数据库可以指Redis数据库。关键词(key)包括类型标识和编号规则标识。类型标识可用于区分不同关键词的作用,类型标识可以指所有单据对应的唯一类型标识,也可以是目标单据的类型对应的类型标识。目标单据的类型包括凭证单据,入库单据和采购单据等等。例如,类型标识可以是唯一的code_rule,代表对应的关键词是用于在处理与所有单据编号相关步骤发挥作用的,该作用可以是辅助查询Redis数据库中存在与关键词对应的历史编号;类型标识可以是凭证单据,入库单据对应的标识分别为proof、storage。编号规则可以用于生成目标单据的单据编号字段的内容。编号规则标识可以指编号规则对应的标识,编号规则标识与编号规则一一对应,例如,编码规则1的编号规则标识可以是“123”。需指出的是,服务器内部包含ID(编号)生成器、redis的id服务、DB(持久化数据库,DateBase)的id服务和Zookeeper,其中,Zookeeper可用于生成分布式锁。
具体地,服务器接收目标单据的编号生成请求,服务器中的编号生成器获取对应的目标单据的关键词后,该编号生成器向内存数据库发送目标单据的关键词。
需要指出的是,图3为一个实施例中单据编号生成方法的原理示意图;如图所示,本案中单据编号生成方法的原理架构主要包括两部分,分别为高速发号模块和持久化模块,高速发号模块主要包括发号器,持久化模块主要包括号段管理器。发号器高速发号、号段管理器持久化。发号器可以在高并发的场景下满足对单据编号的需求,号段管理器则采用了分段式模型的号段管理,依据号段表,分段式的更新号段。且主要包含了四种关键状态:初始化状态、宕机状态、临界状态和预热状态。初始化状态可以指对新的单据第一次进行单据编号的状态。宕机状态可以指当Redis服务断点或其他造成数据丢失的情况发生时继续进行单据编号状态,宕机状态可以在服务断点或其他造成数据丢失情况发生的时候保证后续单据编号生成的正常运行,比如,可以保证宕机发生时后续生成的单据编号与之前的单据编号不重复。临界状态可以指目标编号大于对应上限编号继续进行单据编号状态,临界状态可用于在号段范围内的编号已用完时更新号段。例如,号段为[1~1000],即该号段可以生成的单据编号范围为1到1000的任意整数,且该号段的上限编号为1000,历史编号为1000,当需要生成新的单据编号时,对历史编号1000进行自增处理,得到目标编号为1001,即判断为目标编号大于上限编号,则触发相应的临界状态从而请求持久化模块以获取新的号段。预热状态可以指目标编号不大于对应上限编号且等于预设阈值继续进行单据编号状态,预热状态通过判断目标编号是否不大于对应上限编号且等于预设阈值来提前对上限编号进行更新,以减少同步操作持久化数据库所带来的响应时延。
图5为另一个实施例中单据编号生成方法流程示意图;由图可知,服务器可通过ID生成器向redis的id服务传入关键词key,请求单据编号(id号),当满足1.key存在2.key对应的号段上限值(上限编号)存在3.自增的值不大于上限值,Redis自增得到对应的id(单据编号)。图6为一个实施例中单据编号生成步骤的应用流程图;当key:max-seq-xxx对应的上限编号为200、上一轮的单据编号为149时,可返回本轮的单据编号150。
具体地,服务器确定目标单据对应的编号规则;获取到目标单据对应的编号规则标识;根据编号规则标识形成目标单据的关键词。
在一个实施例中,根据编号规则标识形成目标单据的关键词步骤包括服务器可以将编号规则标识作为目标单据的关键词。服务器也可以将目标单据的类型标识与编号规则标识组合成目标单据的关键词。
例如,目标单据为“供应链单据”,确定该供应链单据的类型标识为“code_rule”,供应链单据对应的编码规则为“编码规则2”,该“编码规则2”对应的编码规则标识为“234”。将“code_rule”和“234”组合成code_rule_234,即目标单据的关键词为“code_rule_234”。
S204,当内存数据库存在与关键词对应的历史编号时,在第一号段范围内对历史编号进行自增处理,得到目标编号。
其中,历史编号可以指当前Redis数据库中存储的编号,例如,历史编号可以为“88”。第一号段可以指当前Redis数据库可以对目标单据进行编号的编号范围,第一号段中的“第一”是用于文中的“第二”“第三”“第四”“第五”等做区分,代表了区别于其他号段,即第一号段与第二号段等是不同的号段,例如,第一号段可以是[1,100],即表示第一号段的范围是1至100,且编号取整数。目标编号可以指对历史编号自增得到的编号。
具体的,服务器可以通过Redis数据库对应的Redis incr命令,对历史编号自增处理,得到目标编号,并将目标编号存储于Redis数据库。
其中,Redis数据库的执行特点是单线程,且是基于内存的数据库。
例如,历史编号为“88”,服务器对“88”自增处理,得到目标编号“89”。图4为一个实施例中内存数据库的自增编号的原理示意图;如图所示,用户A和用户B同时发出编号生成请求,服务器通过Redis的incr方式,实现CAS(比较和交换)模式下的编号原子性。
S206,当目标编号大于第一号段对应的上限编号时,向持久化数据库发送号段更新请求。
其中,上限编号可以指号段中能取的最大编号,例如号段为[1,100],则该号段的上限编号为100。持久化数据库可以是传统数据库,例如,持久化数据库可以是racle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL和浪潮K-DB等数据库。号段更新请求用于当目标编号大于第一号段对应的上限编号时向持久化数据库发送的请求。
具体地,服务器可以获取第一号段对应的上限编号,并将该上限编号与目标编号进行比较,当目标编号大于第一号段对应的上限编号时,服务器中的内存数据库通过服务器向持久化数据库发送号段更新请求。
在一个实施例中,服务器将目标编号与上限编号进行比较,获得比较结果,比较结果包括目标编号大于上限编号和目标编号不大于上限编号。
在一个实施例中,当目标编号不大于上限编号且等于预设阈值时,则判定处于预热状态;在预热状态下,服务器通过内存数据库向持久化数据库发出检索编号请求,以使持久化数据库基于持久化数据库的号段表创建第五号段;通过内存数据库将第五号段中的上限编号对第一号段对应的上限编号进行更新,并将目标编号作为单据编号返回。当目标编号不大于第一号段对应的上限编号且不等于预设阈值时,将目标编号作为单据编号返回。
其中,预设阈值可以指预先设置的阈值,且预设阈值的取值范围为目标编号对应的号段,例如,当目标编号对应的号段为[1~100],则预设阈值可以是1到100的任意整数,例如为50。单据编号可以指最终返回的编号。检索编号请求可以指当处于初始化状态、宕机状态和预热状态时向持久化数据发出的请求,以使持久化数据库创建新的号段。
在一个实施例中,基于持久化数据库的号段表创建第五号段的步骤包括服务器通过持久化数据库获取第四分布式锁;基于第四分布式锁和持久化数据库的号段表创建第五号段。
其中,分布式锁可用在多线程的场景下来保证原子性,从而可以避免传统数据库重复编号,原子性可以指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。第四分布式锁可用在创建第五号段的多线程的场景下来保证原子性。号段表可以指在传统数据库中存储的用于更新号段的表,号段表中包括历史上限编号、待更新最大编号和号段步长等与号段相关的信息。待更新最大编号可以指当前号段的下一号段的上限编号。第五号段可以指Redis数据库可以对目标单据进行编号的编号范围,第五号段中的“第五”是用于文中的“第一”“第二”“第三”“第四”等做区分,代表了第五号段区别于其他号段。
例如,图7为一个实施例中预热状态下单据编号生成步骤的应用流程图;如图所示,服务器通过ID生成器传入key,请求id号,redis的id服务进行Redis自增,并返回id号。当号码(目标编号)超过阈值,异步调用线程,申请更新限制(上限编号),则通过DB(数据库,DateBase)的id服务获取分布式锁,DB的id服务更新号段表,并返回max_seq(上限编号),redis的id服务更新key:max-seq-xxx,即更新上限编号。
在一个实施例中,在S206之后,服务器通过持久化数据库获取第一分布式锁;持久化数据库基于第一分布式锁和持久化数据库的号段表创建第二号段。
其中,第二号段可以指Redis数据库可以对目标单据进行编号的编号范围,第五号段中的“第二”是用于文中的“第一”“第三”“第四”“第五”等做区分,代表了第二号段区别于其他号段。第一分布式锁可用在创建第二号段的多线程的场景下来保证原子性。
S208,内存数据库根据持久化数据库返回的号段更新命令对第一号段进行更新,得到第二号段。
其中,号段更新命令可以指持久化数据库返回给内存数据库,用于更新号段的命令。
具体地,服务器中内存数据库根据持久化数据库返回的号段更新命令对第一号段的上限编号进行更新,得到第二号段。
S210,将第二号段中的起始编号作为单据编号返回。
其中,起始编号可以指号段中开始的或最小的编号,例如,第二号段为[200~300],则起始编号为200。
例如,图8为一个实施例中临界状态下单据编号生成方法应用流程图;如图所示,服务器通过ID生成器传入key,请求id号,redis的id服务进行Redis自增,当前流水号(目标编号)大于最大号限制(上限编号)。申请更新限制(上限编号),则通过DB的id服务获取分布式锁,DB的id服务更新号段表,并返回max_seq(上限编号),redis的id服务更新key:max-seq-xxx,即更新上限编号,并进行Redis自增,得到对应的单据编号。
上述单据编号生成方法中,通过接收目标单据的编号生成请求,并向内存数据库发送目标单据的关键词;当内存数据库存在与关键词对应的历史编号时,在第一号段范围内对历史编号进行自增处理,得到目标编号;高效快捷的生成编号,解决了响应编号请求不及时的问题。不仅如此,还通过当目标编号大于第一号段对应的上限编号时,向持久化数据库发送号段更新请求;内存数据库根据持久化数据库返回的号段更新命令对第一号段进行更新,得到第二号段;将第二号段中的起始编号作为单据编号返回,实现了依据分段式的号段进行单据编号。本发明解决了在高并发场景下现有技术单据编号响应不及时的问题,通过上述创新的内存数据库和持久化数据库之间的编号架构设计,极大的提升了单据编号效率,在高并发下也具有毫秒级的编号响应时延,特别适用于高并发编号的业务场景。
现有单纯采用传统数据库的方案,在面对高并发场景下的编号请求时,单据编号期间往往使用分布式锁来避免重复编号,由此使得整个编号流程串行化,一次响应编号完成才能进行下次编号,这过程中可能被其他请求阻塞,造成编号响应延时;另外在编号过程中,数据库的查询与更新需要I/O操作(输入输出操作),现有技术传统数据库方案的响应存在物理限制,更是会成倍加重所有编号请求的阻塞时间。
本发明方案则完全避免了上述这两个因素造成的阻塞情况,用户的编号请求不会遭遇传统数据库使用分布式锁与I/O操作的延时情况,在高并发下也能做到毫秒级的编号响应,相比现有技术极大的提高了响应速度和效率。
在一个实施例中,如图9所示,初始化状态下的单据编号生成步骤包括:
S902,当内存数据库中不存在目标单据的关键词、且持久化数据库中不存在号段表,或不存在与关键词对应的历史编号、且持久化数据库中不存在号段表时,则判定处于初始化状态。
在一个实施例中,当内存数据库中不存在目标单据的关键词、且持久化数据库中存在号段表,或不存在与关键词对应的历史编号、且持久化数据库中存在号段表时,则判定处于宕机状态;在宕机状态下,通过持久化数据库获取号段表中的历史上限编号和号段步长;通过第三分布式锁对历史上限编号自增得到号段起始编号,以及对历史上限编号增加号段步长得到号段上限编号;依据号段起始编号和号段上限编号确定第四号段;通过内存数据库将第四号段中的起始编号作为单据编号。
其中,历史上限编号可以指已经分配过的号段对应的上限编号,例如,上一轮用于单据编号的号段为[1~100],则历史上限编号为100。号段步长可以指一次更新号段对应的范围,例如,上一轮用于单据编号的号段为[1~100],号段步长为100,则当前可更新的上限编号是200。号段起始编号可以指对历史上限编号自增得到的编码。号段上限编号可以指对历史上限编号增加号段步长,例如,历史上限编号为100,号段步长为200,则号段起始编号可为101,号段上限编号可为200。第三分布式锁可用在创建第四号段的多线程的场景下来保证原子性。第四号段可以指Redis数据库可以对目标单据进行编号的编号范围,第四号段中的“第四”是用于文中的“第一”“第二”“第三”“第五”等做区分,代表了第四号段区别于其他号段。
S904,在初始化状态下,通过内存数据库向持久化数据库发出检索编号请求,以使持久化数据库创建第三号段。
在一个实施例中,持久化数据库创建第三号段的步骤包括持久化数据库获取第二分布式锁,并基于第二分布式锁创建第三号段。
其中,第三号段可以指Redis数据库可以对目标单据进行编号的编号范围,第三段中的“第三”是用于文中的“第一”“第二”“第四”“第五”等做区分,代表了第三号段区别于其他号段。第二分布式锁可用在创建第三号段的多线程的场景下来保证原子性。
S906,通过内存数据库将第三号段中起始编号作为单据编号。
例如,图10为一个实施例中宕机状态下单据编号生成步骤的应用流程图;如图所示,服务器通过ID生成器传入key,请求id号,redis的id服务进行Redis自增,当前流水号(目标编号)超过最大号限制(上限编号)。申请更新限制(上限编号),则通过DB的id服务获取分布式锁,DB的id服务更新号段表,cur_seq(历史上限编号)不为0,说明已分配过号段,说明redis重启,之前的号段丢失更新号段表。并返回max_seq(上限编号),redis的id服务更新key:max-seq-xxx,即更新上限编号,并进行Redis自增,得到对应的单据编号。
图11为一个实施例中初始化状态下的单据编号生成步骤应用流程图;如图所示,服务器通过ID生成器传入key,请求id号,redis的id服务进行Redis自增,当对应key不存在。检索数据库,则通过DB的id服务获取分布式锁,DB的id服务创建记录cur_seq为100,并返回max_seq(上限编号):100,redis的id服务Redis赋值,得到对应的单据编号。
本实施例中,通过当内存数据库中不存在目标单据的关键词、且持久化数据库中不存在号段表,或不存在与关键词对应的历史编号、且持久化数据库中不存在号段表时,则判定处于初始化状态;在初始化状态下,通过内存数据库向持久化数据库发出检索编号请求,以使持久化数据库创建第三号段;通过内存数据库将第三号段中起始编号作为单据编号,实现了初始化状态下单据编号的生成;不仅如此,通过在宕机状态下,通过持久化数据库获取号段表中的历史上限编号和号段步长;通过第三分布式锁对历史上限编号自增得到号段起始编号,以及对历史上限编号增加号段步长得到号段上限编号;依据号段起始编号和号段上限编号确定第四号段;通过内存数据库将第四号段中的起始编号作为单据编号,保证了发生宕机后的单据编号生成的正常运行。
应该理解的是,虽然如上的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的单据编号生成方法的单据编号生成装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个单据编号生成装置实施例中的具体限定可以参见上文中对于单据编号生成方法的限定,在此不再赘述。
在一个实施例中,如图12所示,提供了一种单据编号生成装置,包括:接受与发送模块1202、自增模块1204、发送模块1206、更新模块1208、返回模块1210,其中:
接受与发送模块1202,用于接收目标单据的编号生成请求,并向内存数据库发送所述目标单据的关键词;
自增模块1204,用于当所述内存数据库存在与所述关键词对应的历史编号时,在第一号段范围内对所述历史编号进行自增处理,得到目标编号;
发送模块1206,用于当所述目标编号大于所述第一号段对应的上限编号时,向持久化数据库发送号段更新请求;
更新模块1208,用于所述内存数据库根据所述持久化数据库返回的号段更新命令对所述第一号段进行更新,得到第二号段;
返回模块1210,用于将所述第二号段中的起始编号作为单据编号返回。
在一个实施例中,接受与发送模块1202还用于确定目标单据对应的编号规则;获取到目标单据对应的编号规则标识;根据编号规则标识形成目标单据的关键词。
在一个实施例中,发送模块1206还用于当目标编号不大于上限编号且等于预设阈值时,则判定处于预热状态;在预热状态下,通过内存数据库向持久化数据库的持久化数据库发出检索编号请求,以使持久化数据库基于持久化数据库的号段表创建第五号段;通过内存数据库将第五号段中的上限编号对第一号段对应的上限编号进行更新;当目标编号不大于第一号段对应的上限编号且不等于预设阈值时,将目标编号作为单据编号返回。
在一个实施例中,更新模块1208还用于持久化数据库获取第一分布式锁;持久化数据库基于第一分布式锁和持久化数据库的号段表创建第二号段。
在一个实施例中,如图13所示,该装置还包括:初始化模块1212、宕机模块1214,其中,
初始化模块1212,用于当内存数据库中不存在目标单据的关键词、且持久化数据库中不存在号段表,或不存在与关键词对应的历史编号、且持久化数据库中不存在号段表时,则判定处于初始化状态;在初始化状态下,通过内存数据库向持久化数据库发出检索编号请求,以使持久化数据库创建第三号段;通过内存数据库将第三号段中起始编号作为单据编号。
在一个实施例中,宕机模块1214,用于当内存数据库中不存在目标单据的关键词、且持久化数据库中存在号段表,或不存在与关键词对应的历史编号、且持久化数据库中存在号段表时,则判定处于宕机状态;在宕机状态下,通过持久化数据库获取号段表中的历史上限编号和号段步长;对历史上限编号自增得到号段起始编号,以及对历史上限编号增加号段步长得到号段上限编号;依据号段起始编号和号段上限编号确定第四号段;通过内存数据库将第四号段中的起始编号作为单据编号。
上述实施例,通过接收目标单据的编号生成请求,并向内存数据库发送目标单据的关键词;当内存数据库存在与关键词对应的历史编号时,在第一号段范围内对历史编号进行自增处理,得到目标编号;高效快捷的生成编号,解决了响应编号请求不及时的问题。不仅如此,还通过当目标编号大于第一号段对应的上限编号时,向持久化数据库发送号段更新请求;内存数据库根据持久化数据库返回的号段更新命令对第一号段进行更新,得到第二号段;将第二号段中的起始编号作为单据编号返回,实现了依据分段式的号段进行单据编号。本发明解决了在高并发场景下现有技术单据编号响应不及时的问题,通过创新的内存数据库和持久化数据库之间的编号架构设计,极大的提升了单据编号效率,在高并发下也具有毫秒级的编号响应时延,特别适用于高并发编号的业务场景。
上述单据编号生成装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图14所示。该计算机设备包括处理器、存储器、输入/输出接口(Input/Output,简称I/O)和通信接口。其中,处理器、存储器和输入/输出接口通过系统总线连接,通信接口通过输入/输出接口连接到系统总线。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质和内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储单据编号生成数据。该计算机设备的输入/输出接口用于处理器与外部设备之间交换信息。该计算机设备的通信接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种单据编号生成方法。
本领域技术人员可以理解,图14中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各实施例。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述各实施例。
在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述各实施例。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。
Claims (10)
1.一种单据编号生成方法,其特征在于,所述方法包括:
接收目标单据的编号生成请求,并向内存数据库发送所述目标单据的关键词;
当所述内存数据库存在与所述关键词对应的历史编号时,在第一号段范围内对所述历史编号进行自增处理,得到目标编号;
当所述目标编号大于所述第一号段对应的上限编号时,向持久化数据库发送号段更新请求;
所述内存数据库根据所述持久化数据库返回的号段更新命令对所述第一号段进行更新,得到第二号段;
将所述第二号段中的起始编号作为单据编号返回。
2.根据权利要求1所述的方法,其特征在于,所述向内存数据库发送所述目标单据的关键词之前,所述方法还包括:
确定所述目标单据对应的编号规则;
获取到所述目标单据对应的编号规则标识;
根据所述编号规则标识形成所述目标单据的关键词。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当所述内存数据库中不存在所述目标单据的关键词、且所述持久化数据库中不存在号段表,或不存在与所述关键词对应的历史编号、且所述持久化数据库中不存在号段表时,则判定处于初始化状态;
在所述初始化状态下,通过所述内存数据库向所述持久化数据库发出检索编号请求,以使所述持久化数据库创建第三号段;
通过所述内存数据库将所述第三号段中起始编号作为所述单据编号。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
当所述内存数据库中不存在所述目标单据的关键词、且所述持久化数据库中存在号段表,或不存在与所述关键词对应的历史编号、且所述持久化数据库中存在号段表时,则判定处于宕机状态;
在所述宕机状态下,通过所述持久化数据库获取号段表中的历史上限编号和号段步长;
对所述历史上限编号自增得到号段起始编号,以及对所述历史上限编号增加所述号段步长得到号段上限编号;
依据所述号段起始编号和所述号段上限编号确定第四号段;
通过所述内存数据库将所述第四号段中的起始编号作为所述单据编号。
5.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当所述目标编号不大于所述上限编号且等于预设阈值时,则判定处于预热状态;在所述预热状态下,通过所述内存数据库向所述持久化数据库的持久化数据库发出检索编号请求,以使所述持久化数据库基于所述持久化数据库的号段表创建第五号段;通过所述内存数据库将所述第五号段中的上限编号对所述第一号段对应的上限编号进行更新;
当所述目标编号不大于所述第一号段对应的上限编号且不等于所述预设阈值时,将所述目标编号作为单据编号返回。
6.根据权利要求1所述的方法,其特征在于,所述当所述目标编号大于所述第一号段对应的上限编号时,向持久化数据库发送号段更新请求之后,所述方法还包括:
持久化数据库获取第一分布式锁;
所述持久化数据库基于所述第一分布式锁和所述持久化数据库的号段表创建第二号段。
7.一种单据编号生成装置,其特征在于,所述装置包括:
接受与发送模块,用于接收目标单据的编号生成请求,并向内存数据库发送所述目标单据的关键词;
自增模块,用于当所述内存数据库存在与所述关键词对应的历史编号时,在第一号段范围内对所述历史编号进行自增处理,得到目标编号;
发送模块,用于当所述目标编号大于所述第一号段对应的上限编号时,向持久化数据库发送号段更新请求;
更新模块,用于所述内存数据库根据所述持久化数据库返回的号段更新命令对所述第一号段进行更新,得到第二号段
返回模块,用于将所述第二号段中的起始编号作为单据编号返回。
8.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至6中任一项所述的方法的步骤。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至6中任一项所述的方法的步骤。
10.一种计算机程序产品,包括计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至6中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210435208.0A CN114756589A (zh) | 2022-04-24 | 2022-04-24 | 单据编号生成方法、装置和计算机设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210435208.0A CN114756589A (zh) | 2022-04-24 | 2022-04-24 | 单据编号生成方法、装置和计算机设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114756589A true CN114756589A (zh) | 2022-07-15 |
Family
ID=82333401
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210435208.0A Pending CN114756589A (zh) | 2022-04-24 | 2022-04-24 | 单据编号生成方法、装置和计算机设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114756589A (zh) |
-
2022
- 2022-04-24 CN CN202210435208.0A patent/CN114756589A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110275884B (zh) | 数据存储方法及节点 | |
US9817858B2 (en) | Generating hash values | |
US8732143B2 (en) | Reducing locking during database transactions | |
WO2018040722A1 (zh) | 表数据查询方法及装置 | |
US11294875B2 (en) | Data storage on tree nodes | |
US8280917B1 (en) | Batching content management operations to facilitate efficient database interactions | |
US20220035786A1 (en) | Distributed database management system with dynamically split b-tree indexes | |
CN110036381B (zh) | 存储器内数据搜索技术 | |
CN110633378A (zh) | 一种支持超大规模关系网络的图数据库构建方法 | |
CN108512930B (zh) | 一种共享文件的管理方法、装置、服务器和存储介质 | |
CN106776795B (zh) | 基于Hbase数据库的数据写入方法及装置 | |
CN110909022A (zh) | 一种数据查询方法和装置 | |
KR20200094074A (ko) | 인덱스 관리 방법, 장치, 기기 및 저장 매체 | |
CN111400578B (zh) | 货物数据查询方法、装置、计算机设备和存储介质 | |
CN107066877B (zh) | 一种交易系统的权限变更方法及系统 | |
WO2024021808A1 (zh) | 数据查询请求的处理方法、装置、设备及存储介质 | |
CN114756589A (zh) | 单据编号生成方法、装置和计算机设备 | |
US20180285536A1 (en) | Determining a database signature | |
WO2021207831A1 (en) | Method and systems for indexing databases on a contextual basis | |
CN110750724B (zh) | 数据处理方法、装置、设备和存储介质 | |
US9916373B2 (en) | Dynamic data partitioning extension | |
CN113127717A (zh) | 一种密钥检索方法和系统 | |
US11954039B2 (en) | Caching system and method | |
US11829398B2 (en) | Three-dimensional probabilistic data structure | |
CN114020986B (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 |