一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种库存预占方法、装置、服务器及存储介质与流程

2022-04-25 01:21:25 来源:中国专利 TAG:


1.本发明实施例涉及计算机技术领域,尤其涉及一种库存预占方法、装置、服务器及存储介质。


背景技术:

2.随着物流行业的迅猛发展,大批量商家入驻到各大物流平台,而作为物流平台的重要组成部分—库存预占系统,其承接的库存业务量呈几何倍数增长。
3.在实现本发明的过程中,发明人发现现有技术中存在以下技术问题:现有的库存预占系统的吞吐量已经无法满足当前的库存业务量,库存预占性能较差。


技术实现要素:

4.本发明实施例提供了一种库存预占方法、装置、服务器及存储介质,以实现库存预占过程中的高吞吐量的效果。
5.第一方面,本发明实施例提供了一种库存预占方法,应用于内存服务端,该方法可以包括:
6.接收库存预占指令,其中库存预占指令是应用服务端在内存服务端中查询到库存预占指令中的待获取物品的内存可用库存量之后,发送的用于对待获取物品进行库存预占的指令;
7.从库存预占指令中确定待获取物品的预占库存量,根据预占库存量和内存可用库存量确定是否能够对待获取物品进行库存预占;
8.若是,则基于预占库存量对内存可用库存量进行扣减,并生成与库存预占指令对应的库存扣减任务,基于库存扣减任务对数据库服务端中的待获取物品的数据库可用库存量进行扣减。
9.第二方面,本发明实施例提供了一种库存预占方法,应用于应用服务端,该方法可以包括:
10.在检测到库存预占事件时,获取与库存预占事件对应的待获取物品,查询内存服务端中是否存储有待获取物品的内存可用库存量;
11.如果是,则生成与库存预占事件对应的库存预占指令,并将库存预占指令发送给内存服务端,以使内存服务端根据内存可用库存量和库存预占指令中待获取物品的预占库存量确定能够对待获取物品进行库存预占时,基于预占库存量对内存可用库存量进行扣减,并基于生成的与库存预占指令对应的库存扣减任务对数据库服务端中待获取物品的数据库可用库存量进行扣减。
12.第三方面,本发明实施例还提供了一种库存预占装置,配置于内存服务端,该装置可以包括:
13.库存预占指令接收模块,用于接收库存预占指令,其中库存预占指令包括应用服务端在内存服务端中查询到库存预占指令中的待获取物品的内存可用库存量之后,发送的
用于对待获取物品进行库存预占的指令;
14.库存预占确定模块,用于从库存预占指令中确定待获取物品的预占库存量,根据预占库存量和内存可用库存量确定是否能够对待获取物品进行库存预占;
15.库存预占模块,用于若是,则基于预占库存量对内存可用库存量进行扣减,并生成与库存预占指令对应的库存扣减任务,基于库存扣减任务对数据库服务端中的待获取物品的数据库可用库存量进行扣减。
16.第四方面,本发明实施例还提供了一种库存预占装置,配置于应用服务端,该装置可以包括:
17.内存可用库存量查询模块,用于在检测到库存预占事件时,获取库存预占事件对应的待获取物品,查询内存服务端中是否存储有待获取物品的内存可用库存量;
18.库存预占指令发送模块,用于如果是,则生成与库存预占事件对应的库存预占指令,并将库存预占指令发送给内存服务端,以使该内存服务端根据内存可用库存量和库存预占指令中待获取物品的预占库存量确定能够对待获取物品进行库存预占时,并基于预占库存量对内存可用库存量进行扣减,基于生成的与库存预占指令对应的库存扣减任务对数据库服务端中的待获取物品的数据库可用库存量进行扣减。
19.第五方面,本发明实施例还提供了一种内存服务器,可以包括:
20.一个或多个处理器;
21.存储器,用于存储一个或多个程序;
22.当一个或多个程序被一个或多个处理器执行,使得一个或多个处理器实现本发明任意实施例提供的库存预占方法。
23.第六方面,本发明实施例还提供了一种应用服务器,可以包括:
24.一个或多个处理器;
25.存储器,用于存储一个或多个程序;
26.当一个或多个程序被一个或多个处理器执行,使得一个或多个处理器实现本发明任意实施例提供的库存预占方法。
27.第七方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现本发明任意实施例提供的库存预占方法。
28.本发明实施例的技术方案,内存服务端在接收到经由应用服务端在该内存服务端中查询到待获取物品的内存可用库存量后发送的用于对待获取物品进行库存预占的库存预占指令后,可以从该库存预占指令中确定待获取物品的预占库存量,并根据该预占库存量和该内存可用库存量确定是否能够对待获取物品进行库存预占,即由该内存服务端承担了防超用的责任;若是,则该内存服务端可以基于该预占库存量对该内存可用库存量进行扣减,这是为了待获取物品的下一次的防超用的有效性,然后生成与该库存预占指令对应的库存扣减任务,以便基于该库存扣减任务对数据库服务端中的待获取物品的数据库可用库存量进行扣减,由此实现了待获取物品的库存预占。上述技术方案,通过数据处理速度更快的内存服务端扛起大流量来保证库存预占过程的高吞吐量,而且由于该内存服务端承担了防超用的责任,这使得无需再承担防超用的责任的数据库服务端中的数据库可用库存量的扣减无需按照待获取物品进行分库分表,由此进一步提高了库存预占过程的吞吐量。
附图说明
29.图1是本发明实施例中的一种库存预占方法的流程图;
30.图2是本发明实施例中的另一种库存预占方法的流程图;
31.图3是本发明实施例中的一种库存预占系统中各服务端间的交互流程图;
32.图4a是本发明实施例中的一种库存预占系统中可选示例的第一示意图;
33.图4b是本发明实施例中的一种库存预占系统中可选示例的第二示意图;
34.图4c是本发明实施例中的一种库存预占系统中可选示例的第三示意图;
35.图4d是本发明实施例中的一种库存预占系统中可选示例的第四示意图;
36.图5是本发明实施例中的一种库存预占装置的结构框图;
37.图6是本发明实施例中的另一种库存预占装置的结构框图;
38.图7是本发明实施例中的一种内存服务器的结构示意图;
39.图8是本发明实施例中的一种应用服务器的结构示意图。
具体实施方式
40.下面结合附图和实施例对本发明作进一步详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
41.在介绍本发明各实施例之前,先对它们所阐述的库存预占方法的研发过程进行简要说明:以电商领域的物流平台为例,作为库存预占系统中的重要组成部分——存储有各商品的可售库存量的数据库,其对同一商品的可售库存量的扣减通常是单点在很长一段时间,即库存预占系统是直接使用数据库分库分表进行扣减,数据库有事务保证了扣减的数据准确性,并且该扣减也是单点扣减,即同一商品的扣减均是在同一库的同一表中进行。但是,上述库存预占系统中的数据库基本是与订单系统直接连接的,库存预占的全部流量均会直接归集到数据库中,上游流量的不确定性很容易导致库存预占性能的难以保证。因此,上述库存预占系统无法抗起大流量,因为库存预占的高并发多出现在爆品上,这些爆品的库存量单位(stock keeping uint,sku)是有限的,换言之,即使分库分表再多,最终流量大多是直接打入同一库的同一表中,该同一库的同一表的频繁调用容易导致数据库在性能、硬件等等方面出现损坏,进而导致该数据库的吞吐量的下降;而且,由于多个订单均涉及到同一爆品,而作用在同一库的同一表中的多个订单的扣减是依次执行的,这意味着第n个订单的执行时长是前面的n-1个订单的执行时长的总和,数据库的吞吐量较低。由此可见,现有的库存预占系统的最终性能瓶颈均为数据库层面。
42.在经过上述分析之后,发明人认为,库存预占系统的业务复杂,各商家的个性化逻辑较多,但是库存(即可售库存量)扣减业务相对简单,因此可以将操作库存逻辑高度抽象为库存的加/减操作(如对可售库存量的扣减操作、将被扣减的可售库存量再增加回来的增加操作等),由此可以将业务逻辑抽象至业务层,并且将库存操作抽象至数据处理层,从而达到大道至简、职责单一的目的。在此基础上,发明人提出了下述各库存预占方法。
43.图1是本发明实施例中提供的一种库存预占方法的流程图。本实施例可以适用于库存预占的情况,尤其适用于具有较高的吞吐量的库存预占的情况。该方法可以由本发明实施例提供的库存预占装置来执行,该装置可以由软件和/或硬件的方式实现,该装置可以
集成在内存服务器上。
44.参见图1,本发明实施例的方法具体包括如下步骤:
45.s110、接收库存预占指令,其中库存预占指令是应用服务端在内存服务端中查询到库存预占指令中的待获取物品的内存可用库存量之后,发送的用于对待获取物品进行库存预占的指令。
46.其中,库存预占指令可以是由应用服务端发送的用于对存储在数据库服务端中的数据库可用库存量进行库存预占的指令,该应用服务端可以是配置有可用于驱动内存服务端的代码的服务端,该数据库服务端可以是承载有数据库的服务端,该数据库可用库存量可以是存在该数据库中的能够被使用的库存量。具体的,应用服务端在获取到待获取物品之后,其可以先在内存服务端中进行查询,确定该内存服务端中是否存储有该待获取物品的内存可用库存量,该待获取物品可以是待被物品获取方获取的物品,比如待被买家买到的商品、待被收货者收货的货物等;该内存服务端可以是承载有内存的服务端,相对于数据库服务端,内存服务端的数据处理速度更快;该内存可用库存量可以是存储在该内存服务端中的该待获取物品的可用库存量。进而,如果内存服务端中存储有该内存可用库存量,则应用服务端可以将用于对该待获取物品或是说对该待获取物品在数据库服务端中的数据库可用库存量进行库存预占的库存预占指令发送给内存服务端,此时内存服务端可以接收到该库存预占指令。
47.在实际应用中,可选的,上述内存服务端可以是redis内存服务端,上述数据库服务端可以是mysql数据库服务端,等等,在此未做具体限定。
48.s120、从库存预占指令中确定待获取物品的预占库存量,根据预占库存量和内存可用库存量确定是否能够对待获取物品进行库存预占。
49.其中,预占库存量可以是待获取物品需要预先占用的库存量,其可以体现在库存预占指令中。由此,根据预占库存量和内存可用库存量、或说根据预占库存量和内存可用库存量间的数值关系可以确定是否能够对该待获取物品进行库存预占,该库存预占的成功与否是该待获取物品是否能够被物品获取方获取到的前提所在。示例性的,继续以电商平台为例,如果某商品的内存可用库存量(即可售库存量)大于等于该商品的预占库存量(即销售量),那么该商品能够进行生产售卖,否则该商品不能进行生产售卖。
50.s130、如果是,则基于预占库存量对内存可用库存量进行扣减,并生成与库存预占指令对应的库存扣减任务,基于库存扣减任务对数据库服务端中的待获取物品的数据库可用库存量进行扣减。
51.其中,如果能够对该待获取物品进行库存预占,那么可以基于预占库存量对内存可用库存量进行扣减,即从内存可用库存量中减去预占库存量。需要说明的是,由于内存服务端中存储的内存可用库存量只是一个临时的可用库存量,最终的可用库存量是以数据库服务端中存储的数据库可用库存量为准。由此,在扣减成功后,可以生成库存预占指令对应的库存扣减任务,该库存扣减任务可以是能够表示对哪个待获取物品的数据库可用库存量扣减多少的任务,以便基于该库存扣减任务对数据库服务端中相应的数据库可用库存量进行扣减。
52.在此基础上,可选的,正如上文所述,相对于数据库服务端,内存服务端具有更快的数据处理速度,但是,如果二者的数据处理速度不在一个数量级上,那么基于内存服务端
是很难直接驱动数据库服务端的。为此,上述数据库可用库存量的扣减过程,可以包括:将库存扣减任务发送到任务库中,以使任务库基于接收到的库存扣减任务对数据库服务端进行扫描,根据扫描结果确定数据库服务端中的待获取物品的数据库可用库存量未完成扣减时,基于该库存扣减任务对数据库可用库存量进行扣减。上述技术方案,将能够承接库存扣减任务的任务库作为载体进行内存服务端和数据库服务端间的缓冲,该任务库也可以理解为一个数据库服务端,但是其并不等同于上文阐述的用于存储数据库可用库存量的数据库服务端。这样一来,内存服务端可以先将库存扣减任务发送到任务库中,然后由该任务库对数据库服务端进行驱动,完成库存扣减。在实际应用中,可选的,上述库存扣减任务的发送和/或数据库可用库存量的扣减过程可以异步执行,由此在保证了数据库可用库存量的有效扣减的基础上,提高了其的扣减效率。
53.需要说明的是,上述技术方案是以某待获取物品的库存扣减过程为例进行阐述的,当大流量到来时,大量的待获取物品的库存扣减过程与上述描述相同。为了扛起大量流,本发明实施例在库存预占系统中设置了内存服务端,通过该内存服务端走向内存扣减(即缓存扣减)的路线。在此基础上,为了保证缓存扣减的同时,还能够保证数据库可用库存量的正确性,提出了隔离防超用扣减,单点写(即不同的待获取物品打入同一库的同一表中)变为多点写(即不同的待获取物品打入不同库的不同表中),其巧妙的利用缓存完成防超用的门槛(即在内存服务端中完成是否能够进行库存预占的判断),进而在通过门槛(即根据判断结果确定能够进行库存预占)后进行实际的数据落地(即数据库可用库存量的扣减),由于数据落地已不再承担防超用的责任,因此无需按照待获取物品进行分库分表。因此,在高并发的情况下,其可以避免出现因为某个同一库的同一表的频繁调用而导致数据库服务端出现损坏的情况,也可以避免出现因为这些待获取物品的数据库可用库存量的扣减的依次执行而带来的扣减效率较慢的情况,由此提高了库存占用过程的吞吐量,能够扛起大量流,满足日益增长的库存业务量。而且,虽然内存服务端的设置可能会导致数据库服务端中数据库可用库存量的扣减过程具有延迟性,但是依然采用数据库事务保证的数据库服务端依然具有最终一致性。
54.本发明实施例的技术方案,内存服务端在接收到经由应用服务端在该内存服务端中查询到待获取物品的内存可用库存量后发送的用于对待获取物品进行库存预占的库存预占指令后,可以从该库存预占指令中确定待获取物品的预占库存量,并根据该预占库存量和该内存可用库存量确定是否能够对待获取物品进行库存预占,即由该内存服务端承担了防超用的责任;若是,则该内存服务端可以基于该预占库存量对该内存可用库存量进行扣减,这是为了待获取物品的下一次的防超用的有效性,然后生成与该库存预占指令对应的库存扣减任务,以便基于该库存扣减任务对数据库服务端中的待获取物品的数据库可用库存量进行扣减,由此实现了待获取物品的库存预占。上述技术方案,通过数据处理速度更快的内存服务端扛起大流量来保证库存预占过程的高吞吐量,而且由于该内存服务端承担了防超用的责任,这使得无需再承担防超用的责任的数据库服务端中的数据库可用库存量的扣减无需按照待获取物品进行分库分表,由此进一步提高了库存预占过程的吞吐量。
55.一种可选的技术方案,待获取物品的物品数量为至少两个,各待获取物品源于同一物品获取任务,从库存预占指令中确定待获取物品的预占库存量,可包括:针对库存预占指令中的每个待获取物品,从库存预占指令中确定待获取物品的预占库存量;在生成与库
存预占指令对应的库存扣减任务之前,该库存预占方法,还可包括:确定全部的待获取物品的内存可用库存量是否扣减完成;若否,则基于已扣减完成的待获取物品的预占库存量对扣减后的内存可用库存量进行增加,并将物品获取任务的生成失败结果返回给应用服务端,停止库存预占。其中,一个物品获取任务下可能关联有至少两个待获取物品,如果将该物品获取任务作为一个整体进行处理,或是说基于一个线程对该物品获取任务下的各待获取物品依次进行处理时,此时的处理速度仍是有限的。为此,可以先对该物品获取任务进行拆分,得到该物品获取任务下的各待获取物品,然后再对每个待获取物品分别进行处理,由此可以基于至少两个线程对该物品获取任务下的各待获取物品进行处理,比如,假设待获取物品的物品数量是60个,线程的线程数量是20个,那么可以将这60个待获取物品平均分配到20个线程,此时可以由该20个线程来共同处理该物品获取任务,即在同一时间点内可进行20个待获取物品的处理,从单点处理转变为并发处理的方式提高了处理速度。进而,由于一个物品获取任务下的全部待获取物品均能够扣减成功(即均能够进行生产)时,该物品获取任务方能进行生产,因此在收集到每个待获取物品的扣减结果后,可以确定各待获取物品是否全部扣减完成,如果是则继续执行后续的库存扣减任务的生成,否则说明有些待获取物品因为内存可用库存量不充足而无法进行生产,此时可以对这些已扣减成功的待获取物品的内存可用库存量进行回滚,即基于已扣减完成的待获取物品的预占库存量对扣减后的内存可用库存量进行增加,以使该扣减后的内存可用库存量恢复到扣减前的数量。再进而,可以将该物品获取任务的生成失败结果返回给应用服务端,库存预占结束。上述技术方案,在通过并发写保证库存预占的处理速度的同时,还达到了同一物品获取任务下的各待获取物品的全部扣减或是未扣减的效果。
56.在此基础上,可选的,上述库存预占方法,还可以包括:若扣减后的内存可用库存量的增加操作失败,则发起反向操作请求,并基于反向操作请求再次执行增加操作;若增加操作的执行次数超过预设次数阈值,则将生成失败结果返回给应用服务端,并且将生成的反向操作任务提交至异步回滚队列中,以便基于该异步回滚队列再次执行增加操作。其中反向操作请求和反向操作任务均可以理解为异常补偿机制,当增加操作(即回滚操作)执行失败后,可以通过发起反向操作请求的方式再次进行回滚。但是,为了避免用户的长时间等待,当多次执行增加操作仍然失败后,可以先将生成失败结果返回给应用服务端,让用户得知本次的物品获取任务无法正常生成,与此同时生成反向操作任务,并将该反向操作任务提交至异步回滚队列中,以便基于异步回滚队列再次执行增加操作。上述技术方案,在保证内存可用库存量的有效回滚的同时,还可以避免用户的长时间等待,提高了用户体验。在实际应用中,可选的,上述异常补偿机制可以应用在多个环节,即当某个环节(如某个业务流程)出现异常时,可以同步发起反向操作请求,在反向操作执行异常后还可以提交异步反向操作任务,再在该反向操作任务执行异常后,还可以依赖监控系统扫描异常库存并修改异常库存量,等等,由此保证了可用库存量的准确性。
57.图2是本发明实施例中提供的另一种库存预占方法的流程图。本实施例可适用于库存预占的情况,尤其适用于具有较高的吞吐量的库存预占的情况。该方法可以由本发明实施例提供的库存预占装置来执行,该装置可以由软件和/或硬件的方式实现,该装置可以集成在应用服务器上。
58.参见图2,本发明实施例的方法具体包括如下步骤:
59.s210、在检测到库存预占事件时,获取与库存预占事件对应的待获取物品,查询内存服务端中是否存储有待获取物品的内存可用库存量。
60.其中,库存预占事件可以是在应用服务端被调用时触发的用于对某待获取物品进行库存预占的事件,比如订单系统在接收到订单后、物流系统在接收到物流单后等等通过调用该应用服务端的服务端接口而触发的事件。待获取物品、应用服务端、内存服务端、及内存可用库存量的含义已经在上述实施例中进行详细阐述,在此不再赘述。这里查询内存可用库存量是为了让内存服务端承担起防超用的责任,这使得无需再承担防超用的责任的数据库服务端中的数据库可用库存量的扣减无需按照待获取物品进行分库分表,这是提高库存预占过程的吞吐量的重要手段之一。
61.在实际应用中,可选的,考虑到内存服务端中的内存容量是有限的,其中存储的内存可用库存量不可能无限膨胀,为此该内存服务端中可以设置有淘汰策略,即超过预设时间间隔仍未被操作过的内存可用库存量可以被删除,如1分钟无操作的内存可用库存量将会过期。因此,在内存服务端中进行内存可用库存量的查询时,有可能出现查询不到的情况。在此基础上,由于数据库服务端中存储的数据库可用库存量是永久存储的,因此上述查询内存服务端中是否存储有待获取物品的内存可用库存量,可以包括:查询内存服务端中是否存储有待获取物品的内存可用库存量;如果否,则在数据库服务端中查询该待获取物品的数据库可用库存量,并基于查询到的数据库可用库存量对该内存服务端进行初始化;再次执行查询内存服务端中是否存储有待获取物品的内存可用库存量的步骤。其中数据库服务端和数据库可用库存量的含义已在上述实施例中进行详细阐述,在此不再赘述。即可以从数据库服务端中查询到待获取物品的数据库可用库存量,并基于该数据库可用库存量对该内存服务端进行初始化,或是说将该数据库可用库存量存储到内存服务端中,然后再次在内存服务端中进行查询以确定该内存服务端中是否存储有相应的内存可用库存量,由此保证了最终能在内存服务端中查询到内存可用库存量。
62.s220、若是,则生成与库存预占事件对应的库存预占指令,并将库存预占指令发送给内存服务端,以使内存服务端根据内存可用库存量和库存预占指令中待获取物品的预占库存量确定能够对待获取物品进行库存预占时,基于预占库存量对内存可用库存量进行扣减,并基于生成的与库存预占指令对应的库存扣减任务对数据库服务端中待获取物品的数据库可用库存量进行扣减。
63.其中,库存预占指令是与库存预占事件对应的指令,因此其可以是对该待获取物品进行库存预占的指令。当应用服务端在内存服务端中查询到该待获取物品的内存可用库存量时,接下来可以由该内存服务端基于该内存可用库存量起到防超用的责任,因此应用服务端可以将生成的库存预占指令发送给该内存服务端,以使该内存服务端根据接收到的该库存预占指令实现后续的防超用、驱动数据库服务端等的步骤,这些步骤的具体实现过程已在上述实施例中进行详细阐述,在此不再赘述。
64.本发明实施例的技术方案,应用服务端通过获取到的与检测到的库存预占事件对应的待获取物品,可以在内存服务端中查询其内是否存储有待获取物品的内存可用库存量,这是为了确保该内存服务端是否能够承担起防超用的责任;进而,如果该内存服务端中存在该内存可用库存量,则可以将生成的与该库存预占事件对应的库存预占指令发送给内存服务端,以使该内存服务端根据内存可用库存量和库存预占指令中待获取物品的预占库
存量确定能够对待获取物品进行库存预占时,基于预占库存量对内存可用库存量进行扣减,并基于生成的与该库存预占指令对应的库存扣减任务对数据库服务端中待获取物品的数据库可用库存量进行扣减,由此完成了该待获取物品的库存预占。上述技术方案,应用服务端确定内存服务端能够起到防超用的责任时,可以将相应的库存预占指令发送给内存服务端,以使其根据该库存预占指令完成后续的防超用、驱动数据库服务端的步骤,由此达到了提高库存预占过程的吞吐量的效果。
65.一种可选的技术方案,在检测到库存预占事件时,获取与库存预占事件对应的待获取物品,可以包括:在检测到库存预占事件时,获取与库存预占事件对应的物品获取任务;对物品获取任务进行拆分,得到物品获取任务下的各待获取物品;查询内存服务端中是否存储有待获取物品的内存可用库存量,可以包括:针对每个待获取物品,调用线程池中与待获取物品对应的线程,基于该线程查询内存服务端中是否存储有待获取物品的内存可用库存量;生成与库存预占事件对应的库存预占指令,并将库存预占指令发送给内存服务端,可包括:基于线程生成与库存预占事件对应的针对待获取物品的库存预占指令,并将该库存预占指令发送给内存服务端。其中,正如上文所述,一个物品获取任务下可能关联有至少两个待获取物品,因此可以将该物品获取任务拆分为一个一个的待获取物品,此时无需再将该物品获取任务作为一个整体来进行处理,而是可以将每个待获取物品分别作为独立的个体进行处理。由此,针对每个待获取物品,可以调用线程池中与该待获取物品对应的线程,然后基于这个线程进行内存可用库存量的查询,进而还可以基于这个线程对该内存服务端进行调用来完成该待获取物品的防超用的判断,其将多个待获取物品拆分到至少两个线程中进行处理的方式提高了整个物品获取任务的处理速度。
66.在此基础上,可选的,内存服务端可以包括加载有库存预占脚本的redis内存服务端,则将库存预占指令发送给内存服务端,以使内存服务端根据内存可用库存量和库存预占指令中待获取物品的预占库存量确定能够对待获取物品进行库存预占时,可以包括:将库存预占指令发送给库存预占脚本,以使redis内存服务端在库存预占脚本未被执行时,执行该库存预占脚本来根据内存可用库存量和库存预占指令中待获取物品的预占库存量确定能够对待获取物品进行库存预占时。其中,库存预占脚本可以是用于实现某待获取物品的库存预占的脚本,其可以在redis内存服务端初始化时加载在该redis内存服务端上,需要说明的是,这里设置库存预占脚本的意义在于,在redis中涉及到通道的概念,这使得redis内存服务端需要发生多次交互才能完成上述的防超用、驱动数据库服务端等等的步骤,这种多次交互的方式容易在交互完整性、可用完整性、通信等多个方面出现问题。为此,本技术方案将上述需要多次交互才能完成的内容都封装在该库存预占脚本中,由此在调用内存服务端时,可以一次将全部的参数直接传递到该库存预占脚本中,由此解决了因为多次交互而带来的问题。而且,由于redis具有单线程特性,即在同一时间内只能一个库存预占脚本,因此通过redis和库存预占脚本的相互配合,还可以有效保证了在并发情况下各待获取物品的先后处理顺序。
67.图3是本发明实施例中提供的一种库存预占系统中各服务端的交互过程的流程图。本实施例可适用于库存预占的情况,尤其适用于具有较高的吞吐量的库存预占的情况。
68.如图3所示,本发明实施例的系统可以包括应用服务端1、内存服务端2、任务库3和数据库服务端4,该内存服务端2可以是redis内存服务端,其中,各服务端间的交互过程可
以如下述各步骤所示:
69.s3010、应用服务端1在检测到库存预占事件时,对获取到的与该库存预占事件对应的物品获取任务进行拆分,得到该物品获取任务下的各待获取物品。
70.s3020、针对每个待获取物品,应用服务端1调用线程池中与该待获取物品对应的线程,基于该线程查询内存服务端2中是否存储有该待获取物品的内存可用库存量。
71.s3030、如果未存储,则应用服务端1在数据库服务端4中查询出该待获取物品的数据库可用库存量,并基于查询到的数据库可用库存量对内存服务端2进行初始化,再次执行s3020。
72.s3040、如果有存储,则应用服务端1基于该线程生成与库存预占事件对应的针对该待获取物品的库存预占指令,并将该库存预占指令发送给加载在内存服务端2中的库存预占脚本。
73.s3050、内存服务端2中的库存预占脚本在接收到该库存预占指令后,确定该库存预占脚本是否正在被执行。
74.s3060、如果正在被执行,则内存服务端2基于预设时间间隔再次执行s3050。
75.s3070、如果未正在被执行,则内存服务端2通过执行该库存预占脚本完成下述s3080-s3130。
76.s3080、内存服务端2从库存预占指令中确定待获取物品的预占库存量,并根据预占库存量和内存可用库存量确定是否能够对待获取物品进行库存预占。
77.s3090、如果能够进行库存预占,则内存服务端2基于该预占库存量对内存可用库存量进行扣减,执行s3110。
78.s3100、如果未能够进行库存预占,则内存服务端2保持该内存可用库存量。
79.s3110、内存服务端2确定全部的待获取物品的内存可用库存量是否均扣减完成。
80.s3120、如果未均扣减完成,则内存服务端2基于已扣减完成的待获取物品的预占库存量对扣减后的内存可用库存量进行增加,并将物品获取任务的生成失败结果返回给应用服务端1,结束。
81.s3130、如果均扣减完成,则内存服务端2生成与库存预占指令对应的库存扣减任务,并将该库存扣减任务发送到任务库3中。
82.需要说明的是,针对每个待获取物品,s3020-s3130中各步骤均是可以在与该待获取物品对应的线程中完成,至少两个线程的同时工作提高了整个物品获取任务的处理速度。
83.s3140、任务库3基于该库存扣减任务对数据库服务端4进行扫描,并根据扫描结果确定数据库服务端4中各待获取物品的数据库可用库存量中是否存在未扣减完成的数据库可用库存量。
84.s3150、如果存在,则任务库3基于该库存扣减任务对数据库服务端4中未扣减完成的数据库可用库存量进行扣减。
85.s3160、如果未存在,则结束。
86.本发明实施例的技术方案,通过库存预占系统中应用服务端、内存服务端、任务库和数据库服务端的相互配合,由此达到了库存预占系统在库存预占过程中的高吞吐量的效果。
87.为了更好地理解上述各技术方案的具体实现过程,下面继续以电商平台的应用场景为例,对各实施例的库存预占方法或库存预占系统进行示例性的说明。示例性的,参见图4a所示的库存预占系统中的应用服务端和内存服务端的工作流程图、及图4b所示的库存预占系统中和内存服务端、业务库和数据库服务端的工作流程图。其中:
88.应用服务端在接收到订单系统传递过来的订单之后,将该订单拆分为一个一个的商品,然后针对每个商品,将该商品提交到执行器上,以便由该执行器调用线程池中的一个线程来对该商品进行处理,执行器的本质可以为一段代码。具体的,基于该线程在内存服务端中进行查询,确定是否存在与该商品对应的可售库存量(即内存可售库存量),如果未存在则基于在数据库服务端中查询到的最新的可售库存量(即数据库可售库存量)对内存服务端进行初始化,需要说明的是,由于该商品可能存在于多个订单中,当需要从数据库服务端中查询该商品的可售库存量时,可能出现多个线程先后在数据库服务端中进行查询的情况,此时容易产生幻读的问题,如线程1查询且修改了该可售库存量,然后线程2查询的是被线程1修改前的可售库存量,此时线程2的查询结果不准确,因此在线程1执行过程中可以锁住线程2,由此提出了在初始化过程中利用redis watch命令解决该商品在可售库存量期间的多线程并发的问题。当该应用服务端在内存服务端中查询到该商品的可售库存量后,可以基于该线程将能够体现出该商品和该商品的预占库存量的库存预占命令发送给内存服务端。
89.内存服务端可以是已经加载有库存预占脚本(即lua脚本)的服务端(即图示中的向redis提交执行脚本的过程可以理解为该库存预占脚本的加载过程),该库存预占脚本内可以封装有可售库存量的扣减操作、检测操作等等。在基于上述线程对该库存预占脚本进行调用后,可能出现redis执行成功,但是应用进程终端,订单预占(即库存预占)失败的情况,这可能是由多种原因导致的,如库存预占成功但是服务器连接超时、库存预占失败等等,此时可以存在如下两种解决方案:1)上游重试,重复正常流程,这一重试过程可能是更换订单号重试,也可能是未更换订单号重试;2)上游不重试,此时监控系统可扫描异常单据并检测出异常扣减库存,并执行。需要说明的是,由于该订单下的各商品已经提交到多个执行器上,这意味着在同一时刻内可能存在多个线程同时调用库存预占脚本。在此基础上,当接收到每个商品的可售库存量的扣减结果后,可以先判断一下全部的商品的可售库存量是否均已扣减成功,如果否则对扣减后的可售库存量进行回滚以使该可售库存量恢复到扣减前的数量,并且在回滚后如果存在有些商品经过多次回滚仍然回滚失败的情况,则可以将他们提交到异步回滚队列中进行回滚,并将该订单的生成失败结果及时返回给用户;否则(即全部的商品的可售库存量均已扣减成功),可以生成库存扣减任务,并将该库存扣减任务提交落任务库中,将该订单的生成成功结果返回给用户。可选的,任务库的数量可以是至少一个,由此实现了订单号散列多点写的效果。
90.任务库通过调用任务库引擎对业务库(即配置在数据库服务端中的数据库)中的该订单下的各商品的可售库存量进行扣减,由此完成了该订单的库存预占。
91.在实际应用中,可选的,上述内存服务端中可以设置有内存模型,该内存模型中可以设置有下述数据结构,其可以表示出该内存模型是如何保存数据的,该内存模型可以理解为能够实现上述步骤的模型:
92.usablekey:{库存记录唯一索引}商品的可售库存量;
93.usableaddkey:{库存记录唯一索引}商品的加库存量,记录从redis到db(database,数据库)执行期间的加库存量,这可以应用在订单采购场景中;
94.usablesubtractkey:{库存记录唯一索引}商品的减库存量,记录从redis到db执行期间的减库存量,对数据库服务端中的可售库存量进行扣减前,其可以为预占库存量,而在扣减后可以为0;
95.operatekey:{库存记录唯一索引}:单号防重key防并发重复;
96.usablekey:商品的可售库存量在1分钟无操作后过期,下次操作时可以重新获取db中的可售库存量。
97.在实际应用中,可选的,上述库存预占系统可以是库存系统中的一部分,为了从整体上更好地理解整个库存系统的架构流程,参见图4c,其中库存核心处理层所在的方框即为库存预占系统,它的架构流程可以参见图4d。由此可知,在库存系统的上下游交互中有同步请求(如订单成单过程)、异步请求(如仓内发起操作、临期过期计算等)、商家端/管理端查询操作等。在库存预占系统中,1.0可以表示上一版本的库存预占系统中的已有模块,2.0可以表示当前版本的库存预占系统中的新增模块,其中库存1.0中的各已有模块的含义如下所示:eclp.stock.calc:库存执行层,为核心业务逻辑,eclp.stock.flow:预占、扣减、搬仓入口;库存2.0中的各新增模块的含义如下所示:trade-stock-migration:1-2对接防腐层,trade-stock-biz:核心业务处理层,对接saas,trade-stock-sdk:内存模型,增加库存预占过程的吞吐量,trade-stock-schedule:将内存处理单据下发至任务库(即任务调度系统),trade-stock-storage:数据处理层,承接任务调度中全部处理请求最终落库。
98.上述技术方案,以技术驱动的方式对库存预占系统进行架构升级,通过从“开源、节流、降本”三个方面进行全方位优化,由此解决了因为库存业务量的快速增长而对该库存预占系统带来的冲击,提升了库存预占性能。通过实际测试,对比升级前的库存预占系统的测试结果和升级后的库存预占系统的测试结果发现,在关闭业务日志时,吞吐量大约提升10倍左右,而且在性能方面,依托内存服务端的库存预占(大约性能在300ms左右)相较依托数据库服务端的库存预占(大约性能在70-100ms)下降了大约3倍左右,从而达到了上亿级库存预占的效果,为物流生成交易订单保驾护航,从此库存预占不再成为生成物流交易订单的瓶颈点,这使得物流能够在大促和对社会开放库存功能中起到良好的保障作用。
99.图5为本发明实施例所提供的一种库存预占装置的结构框图,该装置用于执行上述任意实施例提供的库存预占方法。该装置与上述任意实施例中的库存预占方法属于同一个发明构思,在库存预占装置的实施例中未详尽描述的细节内容,可以参考上述库存预占方法的实施例。如图5所示,该装置配置于内存服务端中,具体可包括:库存预占指令接收模块410、库存预占确定模块420和库存预占模块430。
100.其中,库存预占指令接收模块410,用于接收库存预占指令,其中该库存预占指令是应用服务端在内存服务端中查询到库存预占指令中的待获取物品的内存可用库存量之后,发送的用于对待获取物品进行库存预占的指令;
101.库存预占确定模块420,用于从库存预占指令中确定出待获取物品的预占库存量,并根据预占库存量和内存可用库存量确定是否能够对待获取物品进行库存预占;
102.库存预占模块430,用于若是,则基于预占库存量对内存可用库存量进行扣减,并生成与库存预占指令对应的库存扣减任务,基于库存扣减任务对数据库服务端中的待获取
物品的数据库可用库存量进行扣减。
103.可选的,待获取物品的物品数量为至少两个,各待获取物品源于同一物品获取任务,库存预占确定模块420,可以包括:
104.预占库存量确定单元,用于针对库存预占指令中的每个待获取物品,从该库存预占指令中确定待获取物品的预占库存量;
105.在此基础上,上述库存预占装置,还可以包括:
106.扣减完成确定模块,用于在生成与库存预占指令对应的库存扣减任务之前,确定全部的待获取物品的内存可用库存量是否扣减完成;
107.库存预占停止模块,用于若否,则基于已扣减完成的待获取物品的预占库存量对扣减后的内存可用库存量进行增加,并将物品获取任务的生成失败结果返回给应用服务端,停止库存预占。
108.在此基础上,可选的,上述库存预占装置,还可以包括:
109.增加操作执行模块,用于如果扣减后的内存可用库存量的增加操作失败,则发起反向操作请求,并基于反向操作请求再次执行增加操作;
110.增加操作再次执行模块,用于如果增加操作的执行次数超过预设次数阈值,则将生成失败结果返回给应用服务端,并且将生成的反向操作任务提交至异步回滚队列中,以便基于异步回滚队列再次执行增加操作。
111.可选的,库存预占模块430,可以包括:
112.库存扣减单元,用于将库存扣减任务发送到任务库中,以使该任务库基于接收到的库存扣减任务对数据库服务端进行扫描,并根据扫描结果确定数据库服务端中的待获取物品的数据库可用库存量未完成扣减时,基于库存扣减任务对数据库可用库存量进行扣减。
113.本发明实施例所提供的库存预占装置,内存服务端通过库存预占指令接收模块和库存预占确定模块相互配合,在接收到由应用服务端在该内存服务端中查询到待获取物品的内存可用库存量后发送的用于对待获取物品进行库存预占的库存预占指令后,可以从该库存预占指令中确定待获取物品的预占库存量,并根据该预占库存量和该内存可用库存量确定是否能够对待获取物品进行库存预占,即由该内存服务端承担了防超用的责任;通过库存预占模块若是,则该内存服务端可以基于该预占库存量对该内存可用库存量进行扣减,这是为了待获取物品的下一次的防超用的有效性,然后生成与该库存预占指令对应的库存扣减任务,以便基于该库存扣减任务对数据库服务端中的待获取物品的数据库可用库存量进行扣减,由此实现了该待获取物品的库存预占。上述装置,通过数据处理速度更快的内存服务端扛起大流量来保证库存预占过程的高吞吐量,而且由于该内存服务端承担了防超用的责任,这使得无需再承担防超用的责任的数据库服务端中数据库可用库存量的扣减无需按照待获取物品进行分库分表,由此进一步提高了库存预占过程的吞吐量。
114.本发明实施例所提供的库存预占装置可执行本发明任意实施例提供的库存预占方法,具备执行方法相应的功能模块和有益效果。
115.值得注意的是,上述库存预占装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
116.图6为本发明实施例提供的另一种库存预占装置的结构框图,该装置用于执行上述任意实施例所提供的库存预占方法。该装置与上述库存预占方法属于同一个发明构思,在该库存预占装置的实施例中未详尽描述的细节内容,可以参考上述库存预占方法的实施例。如图6所示,该装置配置于应用服务端中,具体可包括:内存可用库存量查询模块510和库存预占指令发送模块520。
117.其中,内存可用库存量查询模块510,用于检测到库存预占事件时,获取与库存预占事件对应的待获取物品,查询内存服务端中是否存储有待获取物品的内存可用库存量;
118.库存预占指令发送模块520,用于如果是,则生成与库存预占事件对应的库存预占指令,并将库存预占指令发送给内存服务端,以使该内存服务端根据内存可用库存量和库存预占指令中待获取物品的预占库存量确定能够对待获取物品进行库存预占时,基于预占库存量对内存可用库存量进行扣减,基于生成的与库存预占指令对应的库存扣减任务对数据库服务端中的待获取物品的数据库可用库存量进行扣减。
119.可选的,库存预占指令发送模块520,可以包括:
120.内存可用库存量查询单元,用于查询内存服务端中是否存储有待获取物品的内存可用库存量;
121.内存服务端初始化单元,用于如果否,则在数据库服务端中查询待获取物品的数据库可用库存量,并基于查询到的数据库可用库存量对内存服务端进行初始化;
122.内存可用库存量再次查询单元,用于再次执行查询内存服务端中是否存储有待获取物品的内存可用库存量的步骤。
123.可选的,内存可用库存量查询模块510,可以包括:
124.物品获取任务获取单元,用于在检测到库存预占事件时,获取与库存预占事件对应的物品获取任务;
125.待获取物品得到单元,用于对物品获取任务进行拆分,得到物品获取任务下的各待获取物品;
126.内存可用库存量查询单元,用于针对每个待获取物品,调用线程池中与该待获取物品对应的线程,基于线程查询内存服务端中是否存储有待获取物品的内存可用库存量;
127.库存预占指令发送模块,可以包括:
128.库存预占指令发送单元,用于基于线程生成与库存预占事件对应的针对待获取物品的库存预占指令,并将库存预占指令发送给内存服务端。
129.在此基础上,可选的,内存服务端包括加载有库存预占脚本的redis内存服务端,上述库存预占指令发送模块520,还可以包括:
130.库存预占脚本执行单元,用于将库存预占指令发送给库存预占脚本,以使redis内存服务端在库存预占脚本未被执行时,执行该库存预占脚本来根据内存可用库存量和库存预占指令中待获取物品的预占库存量确定能够对待获取物品进行库存预占时。
131.本发明实施例中所提供的库存预占装置,应用服务端通过内存可用库存量查询模块获取到的与检测到的库存预占事件对应的待获取物品,可以在该内存服务端中查询其内是否存储有待获取物品的内存可用库存量,这是为了确保该内存服务端是否能够承担起防超用的责任;进而,通过库存预占指令发送如果该内存服务端中存在该内存可用库存量,则可以将生成的与该库存预占事件对应的库存预占指令发送给内存服务端,以使该内存服务
端根据内存可用库存量和库存预占指令中的待获取物品的预占库存量确定能够对待获取物品进行库存预占时,基于预占库存量对内存可用库存量进行扣减,并基于生成的与该库存预占指令对应的库存扣减任务对数据库服务端中待获取物品的数据库可用库存量进行扣减,由此完成了待获取物品的库存预占。上述装置,应用服务端确定内存服务端能够起到防超用的责任时,可以将相应的库存预占指令发送给内存服务端,以使其根据该库存预占指令完成后续的防超用、驱动数据库服务端的步骤,由此达到了提高库存预占过程的吞吐量的效果。
132.本发明实施例所提供的库存预占装置可执行本发明任意实施例提供的库存预占方法,具备执行方法相应的功能模块和有益效果。
133.值得注意的是,上述库存预占装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
134.图7为本发明实施例所提供的一种内存服务器的结构示意图,如图7所示,该内存服务器包括存储器610、处理器620、输入装置630和输出装置640。该内存服务器中的处理器620的数量可以是一个或多个,图7中以一个处理器620为例;内存服务器中的存储器610、处理器620、输入装置630和输出装置640可以通过总线或其它方式连接,图7中以通过总线650连接为例。
135.存储器610作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的库存预占方法对应的程序指令/模块(例如,库存预占装置中的库存预占指令接收模块410、库存预占确定模块420和库存预占模块430)。处理器620通过运行存储在存储器610中的软件程序、指令以及模块,从而执行内存服务器的各种功能应用及数据处理,即实现上述的库存预占方法。
136.存储器610可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据内存服务器的使用所创建的数据等。此外,存储器610可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器610可进一步包括相对于处理器620远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
137.输入装置630可用于接收输入的数字或字符信息,以及产生与装置的用户设置以及功能控制有关的键信号输入。输出装置640可包括显示屏等显示设备。
138.图8为本发明实施例所提供的一种应用服务器的结构示意图,如图8所示,该应用服务器包括存储器710、处理器720、输入装置720和输出装置740。该应用服务器中的处理器720的数量可以是一个或多个,图8中以一个处理器720为例;应用服务器中的存储器710、处理器720、输入装置720和输出装置740可以通过总线或其它方式连接,图8中以通过总线750连接为例。
139.存储器710作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的库存预占方法对应的程序指令/模块(例如,库存预占装置中的内存可用库存量查询模块510和库存预占指令发送520)。处理器720通过运行存储在存储器710中的软件程序、指令以及模块,从而执行应用服务器的各种功能应用及数据处
理,即实现上述的库存预占方法。
140.存储器710可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据应用服务器的使用所创建的数据等。此外,存储器710可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器710可进一步包括相对于处理器720远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
141.输入装置720可用于接收输入的数字或字符信息,以及产生与装置的用户设置以及功能控制有关的键信号输入。输出装置740可包括显示屏等显示设备。
142.本发明实施例所提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种库存预占方法,应用于内存服务端,该方法可以包括:
143.接收库存预占指令,其中库存预占指令是应用服务端在内存服务端中查询到库存预占指令中的待获取物品的内存可用库存量之后,发送的用于对待获取物品进行库存预占的指令;
144.从库存预占指令中确定待获取物品的预占库存量,根据预占库存量和内存可用库存量确定是否能够对待获取物品进行库存预占;
145.若是,则基于预占库存量对内存可用库存量进行扣减,并生成与库存预占指令对应的库存扣减任务,基于库存扣减任务对数据库服务端中的待获取物品的数据库可用库存量进行扣减。
146.当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的库存预占方法中的相关操作。
147.本发明实施例所提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种库存预占方法,应用于应用服务端,该方法可以包括:
148.在检测到库存预占事件时,获取与库存预占事件对应的待获取物品,查询内存服务端中是否存储有待获取物品的内存可用库存量;
149.如果是,则生成与库存预占事件对应的库存预占指令,并将库存预占指令发送给内存服务端,以使内存服务端根据内存可用库存量和库存预占指令中待获取物品的预占库存量确定能够对待获取物品进行库存预占时,基于预占库存量对内存可用库存量进行扣减,并基于生成的与库存预占指令对应的库存扣减任务对数据库服务端中待获取物品的数据库可用库存量进行扣减。
150.当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的库存预占方法中的相关操作。
151.通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。依据这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的
部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、闪存(flash)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
152.注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献