扣减库存数据的方法和装置与流程

文档序号:12158786阅读:441来源:国知局
扣减库存数据的方法和装置与流程
本申请涉及数据处理
技术领域
,尤其涉及一种扣减库存数据的方法和装置。
背景技术
:电子商务是当下互联网行业炙手可热的领域,它既是一个市场,也是一种拓展渠道。电商、电商平台经常组织各种优惠活动来回馈用户,同时扩大自身的影响力。在这些优惠活动中,经常发生很多用户抢购个别商品的情形。例如,在活动开始后,大规模购买商品A的请求并发发生,处理每个请求时都需要扣减数据库中商品A的库存总量,如果库存扣减到零,则请求被拒绝。在数据库中更新商品A的库存总量时,要先对被更新的库存总量加锁,等到更新完毕解锁后,才能接受对该数据的其他更新请求。发生大量对单点数据的并发更新请求时,直接更新数据库中数据的方法不能满足性能要求。现有技术中,将库存总量分配到一台或多台电脑或服务器的内存中,在收到库存更新请求时,扣减内存中的库存量,不必访问数据库,从而提高了响应速度。但是,一旦遇到机器故障,例如宕机、死机或者程序异常终止,内存中的数据丢失,会导致库存数据和交易数据不一致,给用户和商户带来不便。技术实现要素:有鉴于此,本申请提供一种扣减库存数据的方法,应用在保存有总库存 量的后台实例上,包括:导入总库存量的至少部分值到前台实例的内存,保存前台实例的导入记录,包括导入后前台实例的本次初始库存和导入时序标签;保存前台实例的出库记录,包括出库数量和出库时序标签;当前台实例发生故障时,根据导入时序标签和出库时序标签确定扣减本次初始库存的出库数量,按照所确定的出库数量和本次初始库存更新总库存量。本申请提供的一种扣减库存数据的方法,应用在前台实例上,包括:从后台实例导入总库存量的至少部分值到内存,将导入后本实例的本次初始库存返回给后台实例;将每笔出库的出库数量通知后台实例;向后台实例发送心跳通知,供后台实例检测本实例是否发生故障,并在发生故障时根据本次初始库存和出库数量更新总库存量。本申请还提供了一种扣减库存数据的装置,应用在保存有总库存量的后台实例上,包括:分库存导入及记录单元,用于导入总库存量的至少部分值到前台实例的内存,保存前台实例的导入记录,包括导入后前台实例的本次初始库存和导入时序标签;出库记录保存单元,用于保存前台实例的出库记录,包括出库数量和出库时序标签;总库存更新单元,用于当前台实例发生故障时,根据导入时序标签和出库时序标签确定扣减本次初始库存的出库数量,按照所确定的出库数量和本次初始库存更新总库存量。本申请提供的一种扣减库存数据的装置,应用在前台实例上,包括:内存导入单元,用于从后台实例导入总库存量的至少部分值到内存,将导入后本实例的本次初始库存返回给后台实例;出库通知单元,用于将每笔出库的出库数量通知后台实例;心跳通知单元,用于向后台实例发送心跳通知,供后台实例检测本实例是否发生故障,并在发生故障时根据本次初始库存和出库数量更新总库存量。由以上技术方案可见,本申请的实施例中,通过记录导入前台实例内存的本次初始库存和每笔出库数量以及发生时间,在前台实例发生故障时,根据发生时间和出库数量计算前台实例在故障时内存中的分库存量,并将其更新到库存总数据中,从而既能够在内存中扣减库存以高效响应高并发的业务访问,又能避免在发生故障时库存数据和交易数据的不一致,在实现高性能的同时提高了数据的准确性。附图说明图1是本申请实施例中一种应用在后台实例上扣减库存数据的方法的流程图;图2是本申请实施例中一种应用在前台实例上扣减库存数据的方法的流程图;图3是本申请应用示例中之间的交互流程图;图4是应用本申请实施例的计算设备的一种硬件结构图;图5是本申请实施例中一种应用在后台实例上扣减库存数据的装置的逻辑结构图;图6是本申请实施例中一种应用在前台实例上扣减库存数据的装置的逻辑结构图。具体实施方式本申请的实施例提供了一种新的扣减库存数据的方法,通过记录导入前台实例内存的本次初始库存、导入时刻、前台实例的出库数量和出库时刻,在故障导致内存数据丢失时,能够根据所记录的信息还原故障时内存中的库存量,避免库存数据与交易数据不一致,以解决现有技术中存在的问题。本申请的实施例中,前台实例负责接收和响应来自用户或交易系统的扣 减库存的请求,后台实例负责维护总库存量并向前台实例提供可供扣减的分库存。前台实例和后台实例可以是运行在同一台物理或逻辑服务器上的不同进程,其中后台实例可以服务于一个到多个前台实例,每个前台实例具有独立的内存空间用来进行分配给该前台实例的分库存的扣减。前台实例和后台实例也可以运行在不同的物理或逻辑计算设备上,这种组网结构中后台实例也可以服务于一个到多个前台实例;此外,后台实例可以运行在一个到多个物理或逻辑设备上,这些设备协同工作共同完成后台实例的各项功能。本申请的实施例中,扣减库存数据的方法应用在后台实例上的流程如图1所示,应用在前台实例上的流程如图2所示。在前台实例上,步骤210,从后台实例导入总库存量的至少部分值到内存,将导入后本实例的本次初始库存返回给后台实例。在后台实例上,步骤110,导入总库存量的至少部分值到前台实例,保存前台实例的导入记录,包括导入后前台实例的本次初始库存和导入时序标签。在前台实例启动运行时,可以由后台实例主动将总库存量的至少部分值导入到前台实例的内存中;也可以由前台实例先向后台实例请求分库存导入,后台实例响应该请求,将总库存量的至少部分值导入到前台实例的内存中。在前台实例的运行过程中,可以在内存中的分库存量扣减到零、或内存中的分库存量小于请求出库的出库数量时,向后台实例请求分库存导入。可以根据前台实例的数量、并发扣减请求的数量等因素来确定后台实例向前台实例每次导入分库存的具体数值。该数值可以由管理员预先设定,也可以由后台实例或前台实例根据一定的算法确定,本实施例中不做限定。在总库存量的剩余值很小时,后台实例可能将全部的总库存量导入到某个前台实例的内存中。后台实例在将某个数量的库存导入到前台实例时,将总库存量更新为原总库存量中减去导入的数量。前台实例完成分库存导入后,其内存中的分库存量更新为原来内存中的分库存量加上导入的数量,即本次初始库存。前台 实例将本次导入的本次初始库存通知后台实例。后台实例保存本次导入的记录,包括前台实例的本次初始库存和导入时序标签。在一种实现方式中,将导入时刻作为导入时序标签。导入时刻可以由后台实例在收到前台实例的本次初始库存时,根据系统时间自行添加在导入记录中;也可以由前台实例在导入后更新分库存量时采集系统时间作为导入时刻,并将导入时刻与本次初始库存一并通知给后台实例。在另一种实现方式中,后台实例可以为每次前台实例的库存导入生成对应的批次号,并将批次号作为导入时序标签。前台实例在从后台实例导入分库存时,获取本次导入的批次号,该批次号对应于本次导入的本次初始库存;后台实例在保存前台实例的导入记录时,一并保存本次初始库存和对应的批次号。在前台实例上,步骤220,将每笔出库的出库数量通知后台实例。在后台实例上,步骤120,保存前台实例的出库记录,包括出库数量和出库时序标签。前台实例收到来自用户或交易系统的扣减库存请求后,如果内存中的分库存量不小于请求出库的数量,则将分库存量减去请求出库的数量,并返回成功扣减的响应,完成出库。前台实例将每次完成出库的出库数量通知后台实例。后台实例保存出库记录,其中包括前台实例每笔出库的出库数量和出库时序标签。在将导入时刻作为导入时序标签的实现中,可以将出库时刻作为出库时序标签。与导入时刻类似,后台实例可以在收到前台实例某笔出库的出库数量时,采集系统时间作为该笔出库的出库时刻。也可以由前台实例在完成出库时采集系统时间作为出库时刻,并将出库时刻与出库数量一并通知给后台实例。在将批次号作为导入时序标签的实现中,可以将出库扣减的本次初始库存所对应的批次号作为出库时序标签。本次出库时所扣减的分库存量是哪个 本次初始库存的剩余量,这个本次初始库存即是出库数量所扣减的本次初始库存。前台实例在每笔出库后,将出库数量通知后台实例时,也一并将本笔出库所扣减的本次初始库存所对应的批次号通知后台实例;后台实例在前台实例的出库记录中保存每笔出库的出库数量和批次号。在前台实例上,步骤230,向后台实例发送心跳通知,供后台实例检测本实例是否发生故障,并在发生故障时根据本次初始库存和出库数量更新总库存量。在后台实例上,步骤130,当前台实例发生故障时,根据导入时序标签和出库时序标签确定扣减本次初始库存的出库数量,按照所确定的出库数量和本次初始库存更新总库存量。本实施例中,在前台实例与后台实例的交互中,任何可以让后台实例感知到前台实例在正常运行的来自前台实例的数据、请求或其他信息都可以作为心跳通知。例如,前台实例在导入库存后向后台实例返回其本次初始库存可以看做前台实例的心跳通知,前台实例在出库后向后台实例发送出库数量也可以看做前台实例的心跳通知。前台实例也可以在满足一定条件时主动向后台实例发送心跳通知,以告知后台实例自身工作状态正常,例如,前台实例可以在每出库N笔时向后台实例发送心跳通知;和/或,在与上一次的心跳通知(可以包括返回本次初始库存、发送出库数量)的发送时间间隔达到预设通知阈值时,向后台实例发送心跳通知。根据实际应用场景和心跳通知方式的不同,后台实例可以采用不同的判断标准来确定前台实例是否发生故障。此外,现有技术中各种检测某个设备、某个设备上运行的进程的状态是否正常的方式都可以在本申请的实施例中用来检测前台实例是否发生故障,不再赘述。在一种实现方式中,在后台实例上为每个前台实例维护一个刷新时刻,根据前台实例心跳通知的发生时间来更新该刷新时刻。例如,可以由后台实例在每次收到前台实例的心跳通知时,将刷新时刻改写为接收时刻;也可以由前台实例利用心跳通知,来将保存在后台实例上的刷新时刻改写为心跳通 知的发送时刻。这种实现方式中,后台实例如果检测到前台实例的刷新时刻距当前时刻超过预设故障故障阈值时,认为前台实例发生故障。后台实例可以为每个前台实例的刷新时刻设置定时为预设故障阈值的定时器,在改写刷新时刻时重置定时器;当定时器时间到时,后台实例得知前台实例发生故障。后台实例也可以周期性扫描所有前台实例的刷新时刻,来检测是否有距当前时刻超过预设故障阈值的刷新时刻,如果有,则该刷新时刻所属的前台实例发生故障。当前台实例发生故障时,其内存中的分库存量可能还没有全部扣减完毕,这些分库存量因前台实例的故障无法继续用来响应用户或交易系统的请求,而这些分库存量已经在总库存量中去除,就造成了库存数据与交易数据的不一致。因此,在后台实例检测到前台实例发生故障时,根据导入时序标签和出库时序标签来确定在本次导入之后发生了多少笔出库以及每笔出库的出库数量,即扣减本次初始库存的出库数量,再按照本次导入之后发生的出库数量和本次初始库存来更新总库存量。在将导入时刻作为导入时序标签的实现中,以导入时刻为基准,查找出库时刻在导入时刻之后的各笔出库记录中的出库数量,即为扣减本次初始库存的出库数量。在将批次号作为导入时序标签的实现中,具有本次初始库存所对应的批次号的出库记录中的出库数量,就是扣减本次初始库存的出库数量。可见,将批次号作为导入时序标签可以不必比较导入时刻和每笔出库记录的出库时刻,能够提高更新总库存量的运行速度。在得到扣减本次初始库存的出库数量(可能是零笔到多笔)后,计算这些出库数量之和,得到本次导入后该前台实例的出库总量;如果出库总量等于本次初始库存,则该前台实例在故障时内存中分库存量为零,流程结束;如果出库总量小于本次初始库存,则该前台实例在故障时内存中尚有分库存量,把出库总量与本次初始库存的差值加回到总库存量中,即可达到库存数据与交易数据的一致性。从上述过程可以看出,在前台实例发生故障后,只需要最后一次导入分 库存的记录和最后一次导入分库存后的出库记录即可得到故障发生时前台实例内存中剩余的库存量。因此,后台实例可以在保存前台实例的本次导入记录后,将该前台实例的上次导入记录置为无效;在检测到前台实例发生故障后,采用当前有效的导入记录(即最后一次导入的记录)中的导入时刻和本次初始库存来更新总库存量。可见,本申请的实施例中通过记录每次导入分库存后前台实例的本次初始库存和导入时序标签,以及每笔出库的出库数量以及出库时序标签,在前台实例发生故障导致内存数据丢失时,根据所记录的时序和数量即可还原故障时内存中的分库存量,并将其更新到库存总数据中,既实现了在内存中扣减库存以满足高并发的性能要求,又能够在发生故障时达到库存数据和交易数据的一致性。在本申请的一个应用示例中,前台实例为数台库存服务器,后台实例包括数据库服务器和任务调度服务器。库存服务器接收并响应用户的扣减库存请求,库存服务器、数据库服务器和任务调度服务器之间的交互流程如图3所示。当库存服务器收到用户的扣减库存请求时,发现内存中的分库存量已经扣减到零,向数据库服务器请求导入分库存。数据库服务器将总库存量中的一部分导入到库存服务器的内存中,从总库存量中减去所导入的部分。数据库服务器生成本次导入的批次号,并将批次号告知库存服务器。库存服务器将本次导入完成时内存中的分库存量,即本次初始库存通知数据库服务器。数据库服务器在内存记录表(Memory_Record)中增加一行记录,保存本次导入的发生时间、库存服务器的刷新时刻、本次导入的批次号、本次初始库存。一种内存记录表的结构示例如表1所示:IDGmt_createGmt_modifiedStorageBatch_idStatus116:37:5416:37:58100234disable216:37:5916:37:59100235active表1表1中,ID为行标识;Gmt_create为导入的发生时间;Gmt_modified为库存服务器的刷新时刻,本应用实例中心跳通知包括库存服务器上传本次初始库存,第2行记录中刷新时刻与本次导入的发生时间相同;Storage为导入后的本次初始库存;Batch_id为导入的批次号;Status为表1中导入记录的状态,当本次导入完成时,同一个库存服务器的上次导入记录被置为无效(disable)。库存服务器响应用户的扣减库存请求,从内存中的分库存量中减去用户请求扣减的数量2,将扣减成功的消息作为响应通知用户。库存服务器向数据库服务器发送出库通知,其中包括本笔出库的出库数量、所扣减本次初始库存的批次号。数据服务器在出库记录表(Outstorage_Record)中增加一行记录,保存本笔出库的出库时刻、出库数量和所扣减本次初始库存的批次号。一种出库记录表的结构可以如表2所示:IdGmt_createReq_numBatch_id116:38:002235表2表2中,ID为行标识;Gmt_create为本笔出库的出库时刻;Req_num为本笔出库的出库数量;Batch_id为本笔出库所扣减本次初始库存的批次号。库存服务器每出库5笔,向服务器发送一次心跳通知,该心跳通知用来更新内存记录表中的库存服务器本次初始库存对应的批次号所在行中的Gmt_modified,将Gmt_modified更新为当前时刻。同时,库存服务器维护一个心跳定时器,每次发送心跳通知时重置心跳定时器;如果心跳定时器定时时,则向数据库服务器发送心跳通知。这样,可以确保向数据库服务器发送心跳通知的时间间隔不会超过心跳定时器的定时。任务调度服务器定时扫描内存记录表中状态为有效(active)的记录中的Gmt_modified字段,如果该字段的时刻在当前时刻减去预设故障阈值的时刻 之前,则判定该记录异常,所对应的库存服务器发生故障。任务调度服务器提取内存记录表中该记录的批次号和本次初始库存,在出库记录表查找出所有具有该批次号的记录,将这些记录中的出库数量加总,和本次初始库存做比较,判断本批次分库存是否完全出库;如果出库数量之和小于本次初始库存,则这批次的分库存并未完全出库,将差值加回到库存服务器的总库存量中。与上述流程实现对应,本申请的实施例还提供了一种应用在后台实例上的扣减库存数据的装置,和一种应用在前台实例上的扣减库存数据的装置。这两种装置均可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为逻辑意义上的装置,是通过装置所在计算设备的CPU(CentralProcessUnit,中央处理器)将对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,除了图4所示的CPU、内存以及非易失性存储器之外,扣减库存数据的装置所在的计算设备通常还包括用于实现网络通信功能的板卡等其他硬件。图5所示为本申请实施例提供的一种扣减库存数据的装置,应用在保存有总库存量的后台实例上,其特征在于,包括分库存导入及记录单元、出库记录保存单元和总库存更新单元,其中:分库存导入及记录单元用于导入总库存量的至少部分值到前台实例的内存,保存前台实例的导入记录,包括导入后前台实例的本次初始库存和导入时序标签;出库记录保存单元用于保存前台实例的出库记录,包括出库数量和出库时序标签;总库存更新单元用于当前台实例发生故障时,根据导入时序标签和出库时序标签确定扣减本次初始库存的出库数量,按照所确定的出库数量和本次初始库存更新总库存量。一种实现方式中,所述导入时序标签为导入时刻;所述出库时序标签为出库时刻;所述扣减本次初始库存的出库数量包括:出库时刻在本次初始库存的导入时刻之后的出库数量。另一种实现方式中,所述导入时序标签包括:本次导入的批次号;所述出库时序标签包括:出库扣减的本次初始库存所对应的批次号;所述扣减本 次初始库存的出库数量包括:具有本次初始库存对应的批次号的出库数量。可选的,所述装置还包括心跳更新单元,用于根据前台实例心跳通知的发生时间更新前台实例的刷新时刻;所述前台实例发生故障包括:前台实例的刷新时刻距当前时刻超过预设故障阈值。可选的,所述心跳通知包括:前台实例导入库存后返回其本次初始库存,和/或前台实例发送出库数量。可选的,所述总库存更新单元按照所确定的出库数量和本次初始库存更新总库存量,包括:计算所确定的出库数量之和,如果所述出库数量之和小于本次初始库存,则将出库数量之和与本次初始库存的差值加入当前总库存量。图6所示为本申请实施例提供的一种扣减库存数据的装置,应用在前台实例上,其特征在于,包括内存导入单元、出库通知单元和心跳通知单元,其中:内存导入单元用于从后台实例导入总库存量的至少部分值到内存,将导入后本实例的本次初始库存返回给后台实例;出库通知单元用于将每笔出库的出库数量通知后台实例;心跳通知单元用于向后台实例发送心跳通知,供后台实例检测本实例是否发生故障,并在发生故障时根据本次初始库存和出库数量更新总库存量。可选的,所述心跳通知单元具体用于:每出库N笔,向后台实例发送心跳通知;和/或,与上一次心跳通知的发送时间间隔达到预设通知阈值时,向后台实例发送心跳通知。可选的,所述内存导入单元从后台实例导入总库存量的至少部分值,包括:当本实例的分库存量扣减到零、或本实例的分库存量小于请求出库的出库数量时,从后台实例导入总库存量的至少部分值。可选的,所述内存导入单元从后台实例导入总库存量的至少部分值,包括:从后台实例导入总库存量的至少部分值,获取导入后本次初始库存对应的批次号;所述出库通知单元具体用于:将每笔出库的出库数量和所扣减的本次初始库存所对应的批次号通知后台实例。以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质的示例。计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算 机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1