秒杀处理方法及系统与流程

文档序号:27014494发布日期:2021-10-22 23:14阅读:250来源:国知局
1.本发明涉及计算机技术,尤其涉及一种秒杀处理方法及系统。
背景技术
::2.秒杀抢购促销活动日益成为电商公司吸引用户注册、提升用户活跃度的重要手段。其中,秒杀响应速度、库存扣减精准度以及稳定可靠是衡量秒杀系统优劣的三个关键指标。3.现有技术中,通常是在秒杀开始前,将秒杀库存信息初始化并存入数据库中。当秒杀活动开始后,查询数据库中的库存,当库存大于0时,扣减成功,并更新数据库的库存,否则扣减失败;然后对用户条件进行条件检查生成订单信息,若检查失败或者生成订单失败,进行退库操作。4.但是,由于在秒杀场景中,并发量极高,库存很容易出现多扣现象,而在退库时,又很容易出现少扣,也就是说,现有技术存在着库存扣减精准度不高的问题。技术实现要素:5.针对上述问题,本发明提供了一种秒杀处理方法及系统。6.第一方面,本发明提供了一种秒杀处理方法,包括:从数据库中查询秒杀活动的库存信息,并将所述库存信息加载至远程字典服务redis缓存中,所述库存信息包括库存数量;接收并响应于秒杀请求,redis执行lua脚本对redis缓存中的库存数量进行扣减,并判断扣减后的库存数量是否大于等于0,若是,输出扣减成功指令;根据所述扣减成功指令生成秒杀订单,并更新数据库中的库存信息。7.在其他可选的实施方式中,所述接收并响应于秒杀请求,包括:接收秒杀请求,判断所述秒杀请求是否满足预设前置条件,若是,响应所述秒杀请求。8.在其他可选的实施方式中,若判断扣减后的库存数量不大于等于0,返回秒杀结束信息。9.在其他可选的实施方式中,在判断扣减后的库存数量大于等于0之后,还包括:判断所述秒杀请求是否满足预设后置条件;若是,输出扣减成功指令;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息。10.在其他可选的实施方式中,在所述根据所述扣减成功指令生成秒杀订单之后,还包括:判断用户支付是否成功;若是,秒杀成功;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息。11.在其他可选的实施方式中,所述预设前置条件包括以下至少一种:用户限制、秒杀时间或者智能限流。12.第二方面,本发明提供一种秒杀处理系统,包括:13.库存信息初始化模块,用于从数据库中查询秒杀活动的库存信息,并将所述库存信息加载至远程字典服务redis缓存中,所述库存信息包括库存数量;第一处理模块,用于接收并响应于秒杀请求,redis执行lua脚本对redis缓存中的库存数量进行扣减,并判断扣减后的库存数量是否大于等于0,若是,输出扣减成功指令;第二处理模块,用于根据所述扣减成功指令生成秒杀订单,并更新数据库中的库存信息。14.在其他可选的实施方式中,所述第一处理模块具体用于:接收秒杀请求,判断所述秒杀请求是否满足预设前置条件,若是,响应所述秒杀请求。15.在其他可选的实施方式中,所述第一处理模块,还用于:若判断扣减后的库存数量不大于等于0,返回秒杀结束信息。16.在其他可选的实施方式中,所述第一处理模块,还用于在判断扣减后的库存数量大于等于0之后,判断所述秒杀请求是否满足预设后置条件;若是,输出扣减成功指令;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息。17.在其他可选的实施方式中,所述第二处理模块还用于在根据所述扣减成功指令生成秒杀订单之后,判断用户支付是否成功;若是,秒杀成功;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息。18.本发明提供的秒杀处理方法及系统,通过从数据库中查询秒杀活动的库存信息,并将所述库存信息加载至redis缓存中,所述库存信息包括库存数量;接收并响应于秒杀请求,redis执行lua脚本对redis缓存中的库存数量进行扣减,并判断扣减后的库存数量是否大于等于0,若是,输出扣减成功指令;根据所述扣减成功指令生成秒杀订单,并更新数据库中的库存信息;即本发明示例通过redis执行lua脚本来实现库存扣减,保证扣减过程的原子性,不至于出现多扣和少扣的情况,提高了库存扣减的精准度。附图说明19.图1为本发明所基于的一种应用场景示意图;20.图2为本发明提供的一种秒杀处理方法的流程示意图;21.图3为本发明提供的另一种秒杀处理方法的流程示意图;22.图4为本发明提供的一种秒杀处理方法的示意图;23.图5为本发明提供的一种库存退库过程的示意图;24.图6为本发明提供的一种秒杀处理系统的结构示意图。具体实施方式25.为使本发明示例的目的、技术方案和优点更加清楚,下面将结合本发明示例中的附图,对本发明示例中的技术方案进行清楚、完整地描述。26.首先对本发明所涉及的名词进行解释:27.redis(全称:remotedictionaryserver远程字典服务)是一个开源的使用ansic语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的api。28.秒杀抢购促销活动日益成为电商公司吸引用户注册、提升用户活跃度的重要手段。其中,评价一个秒杀系统的优劣主要包括以下三个关键指标:秒杀响应速度、库存扣减精准度以及稳定可靠性。29.现有技术中,通常是基于数据库,使用行级锁的方式实现秒杀扣减,具体过程如下:30.第一步,创建秒杀活动。具体来说,秒杀开始前,在运营后台创建一个秒杀活动,填入必须的几个信息,包括秒杀活动编号、秒杀开始时间、秒杀结束时间、秒杀价格、库存数量等信息。31.第二步,初始化库存。具体来说,将上述相关信息存储至关系型数据库中,形成库存数据表,用stock_table表示,另外秒杀活动编号用activityid表示,库存数量用stock表示。32.第三步,用户秒杀,库存扣减。具体来说,当用户通过客户端发出秒杀请求后,运营平台会查询数据库中所存储的库存数量,如代码所示:selectstockfromstock_tablewhereactivityid=xxx;然后判断库存数量是否大于0,若否,则扣减失败;若是,则扣减成功,并更新数据库中的库存数量,如代码所示:updatestock_tablesetstock=stock-1whereactivityid=xxx;扣减成功后,做用户条件检查,并生成订单,如果用户条件检查不通过或者生成订单失败,则进行退库操作,如代码所示:updatestock_tablesetstock=stock+1whereactivityid=xxx,如果用户检查通过且成功生成订单,则秒杀成功。33.但由于在秒杀场景中,并发量极高,库存很容易出现多扣现象,而在退库时,又很容易出现少扣。举例来说,如果两个用户同一时间秒杀,从数据库查询库存时拿到的数据假如都是100,那么这两个用户肯定能成功扣减,此时扣减后库存就是99,但实际情况已经扣减了两个,此时就出现了多扣。同理,当两个退库同时发起时,实际退库2个,但在数据库中却只退库1个,就出现秒杀商品少扣的问题。也就是说,现有技术存在着库存扣减精准度不高的问题。34.为解决上述问题,本发明的技术构思在于,利用redis单线程执行指令的特性,来避免多扣或少扣现象,提高库存扣减精准度。35.图1为本发明所基于的一种应用场景示意图,如图1所示,包括服务端1和多个客户端2,用户通过客户端2向服务端1发送秒杀请求,服务端1接收到秒杀请求后响应并处理秒杀请求,返回客户端2秒杀成功或失败的消息。其中,服务端1可用于执行下述各实施方式中所述的秒杀处理方法。36.第一方面,本发明示例提供了一种秒杀处理方法,图2为本发明提供的一种秒杀处理方法的流程示意图。37.如图2所示,该秒杀处理方法包括:38.步骤101、从数据库中查询秒杀活动的库存信息,并将所述库存信息加载至redis缓存中。其中,所述库存信息包括库存数量。39.具体来说,需要开展秒杀活动的商家将秒杀活动的相关信息存储到数据库中,包括秒杀活动编号、秒杀开始时间、秒杀结束时间、秒杀价格、库存数量等信息。然后从数据库中查找到库存数量等信息加载至redis缓存以实现库存初始化,例如通过redis的set指令来完成初始化,如下所示:40.setstock_90001100;描述秒杀活动编号为90001的库存初始化为100。41.需要说明的是,现有技术中,由于库存数量stock存储于关系型数据库,受制于连接数及数据库自身的限制,加上行级锁,导致在高并发请求下,数据库性能将急剧下降甚至出现异常,导致查询及更新库存失败,业务系统在大量异常的压力下可能宕机卡死,给用户造成的体验就是,用户点击秒杀后,系统长时间没有响应,而本发明示例通过使用redis缓存,减少对数据库的访问,减轻数据库的压力,加快了秒杀请求的响应时间。42.步骤102、接收并响应于秒杀请求,redis执行lua脚本对redis缓存中的库存数量进行扣减,并判断扣减后的库存数量是否大于等于0,若是,输出扣减成功指令。43.具体来说,秒杀活动开始后,用户通过客户端向服务端发送秒杀请求,服务端接收到秒杀请求后,响应所述秒杀请求,redis执行lua脚本,lua脚本包括,首先对库存数量进行扣减,然后判断扣减后的数量是否大于等于0,若大于0,说明有足够的商品库存供用户秒杀,则输出扣减成功指令;当扣减后的库存数量小于0后,说明商品已没有库存,此时可以通知客户端,秒杀活动已结束,或者通知商家已售完,以便于商家增加库存或者结束秒杀活动。44.举例来说,lua脚本代码可如下所示:[0045][0046]另外,秒杀请求可以包括用户信息、商品信息等以便服务端在接收到秒杀请求后能生成对应的订单信息。[0047]作为可选的实施方式,所述接收并响应于秒杀请求,包括:接收秒杀请求,判断所述秒杀请求是否满足预设前置条件,若是,响应所述秒杀请求。[0048]具体来说,在现实场景中,会有很多用户通过客户端向同时向服务端发起秒杀请求,即使引入redis缓存方案,但在后续用户条件检查及下单出货等业务逻辑时,仍然耗时非常多;并且如果不设置前置条件检查,会产生大量的退库,效率严重低下,所以本示例并不是对所有的秒杀请求进行响应,而是要对所有的秒杀请求进行预设前置条件检查,只有满足预设前置条件的秒杀请求,服务端才会对其进行响应,进一步提高了响应速度。[0049]作为可选的实施方式,所述预设前置条件包括以下至少一种:用户限制、秒杀时间或者智能限流。[0050]具体来说,可以利用openresty平台、lua脚本、redis来完成用户限制、秒杀时间或者智能限流等工作,以减少库存扣减的压力,提高响应速度。举例来说,可以预设用户信息,判断秒杀请求携带的用户信息是否与预设用户信息匹配,若匹配,才会对秒杀请求进行响应;或者预设秒杀时间范围,当用户发送的秒杀请求的时间在预设秒杀时间范围内时,才会对秒杀请求进行响应;或者限制秒杀请求到达服务器的数量等。[0051]步骤103、根据所述扣减成功指令生成秒杀订单,并更新数据库中的库存信息。[0052]具体来说,执行lua脚本后,会输出扣减成功或失败指令,当输出扣减成功指令后,可以生成对应的秒杀订单,并更新数据库中的库存数量。[0053]本发明提供的秒杀处理方法及系统,通过从数据库中查询秒杀活动的库存信息,并将所述库存信息加载至redis缓存中,所述库存信息包括库存数量;接收并响应于秒杀请求,redis执行lua脚本对redis缓存中的库存数量进行扣减,并判断扣减后的库存数量是否大于等于0,若是,输出扣减成功指令;根据所述扣减成功指令生成秒杀订单,并更新数据库中的库存信息;即本发明示例通过将库存数量加载至redis缓存中,通过redis执行lua脚本来实现库存扣减,保证扣减过程的原子性,不至于出现多扣和少扣的情况,提高了库存扣减的精准度。[0054]结合前述的各实现方式,图3为本发明提供的另一种秒杀处理方法的流程示意图,如图3所示,该秒杀处理方法包括:[0055]步骤201、从数据库中查询秒杀活动的库存信息,并将所述库存信息加载至redis缓存中。其中,所述库存信息包括库存数量。[0056]步骤202、接收并响应于秒杀请求,redis执行lua脚本对redis缓存中的库存数量进行扣减,并判断扣减后的库存数量是否大于等于0。[0057]若否,执行步骤203,若是,执行步骤204。[0058]步骤203、返回秒杀结束信息。[0059]步骤204、判断所述秒杀请求是否满足预设后置条件。[0060]具体来说,后置条件主要是对前置条件检查的补充,可以做任何业务需求的检查,也可以不作处理。通常来说,可以对用户做二次认证。[0061]若否,执行步骤205,若是,执行步骤206。[0062]步骤205、对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息。结束。[0063]具体来说,本发明首先是在接收到秒杀请求或者满足预设前置条件的秒杀请求后,会先扣减库存数量,当在后续过程中由于后置条件检查不通过,或者用户支付失败等导致秒杀失败,则会进行退库操作,即将扣减的库存数量再变更为原先的库存数量,本示例中可以使用redis的incr指令实现,即当使用redis执行lua脚本时,不满足条件时,会调用incr指令实现退库,同时向用户的客户端返回秒杀失败的信息,以便于用户重新发起秒杀或者结束秒杀。[0064]步骤206、输出扣减成功指令。[0065]步骤207、根据所述扣减成功指令生成秒杀订单,并更新数据库中的库存信息。[0066]步骤208、判断用户支付是否成功。[0067]若是,执行步骤209;若否,执行步骤205。[0068]步骤209、秒杀成功。结束。[0069]具体来说,用户秒杀成功后,商家进行下单出货,可以用一个队列来实现,只需要将相关的业务信息使用异步的方式放入下单出货队列中,后续具体的下单出货由订单系统完成,秒杀成功。[0070]本实施方式中的步骤201、步骤202以及步骤207分别与前述实施方式中的步骤101、步骤102以及步骤103的实现方式类似,在此不进行赘述。[0071]与前述实施方式不同的是,本实施方式进一步限定了秒杀处理的具体实现过程。在本实施方式中,若判断扣减后的库存数量不大于等于0,返回秒杀结束信息;若判断扣减后的库存数量大于等于0,则继续判断所述秒杀请求是否满足预设后置条件;若是,输出扣减成功指令;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息;在所述根据所述扣减成功指令生成秒杀订单之后,判断用户支付是否成功;若是,秒杀成功;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息。[0072]具体来说,图4为本发明提供的一种秒杀处理方法的示意图,如图4所示,首先对库存进行初始化,秒杀活动开始后,对秒杀请求进行前置条件检查,检查成功的,库存扣减,然后进行后置条件检查,若失败,进行退库操作,若成功,则下单出货,秒杀结束。图5为本发明提供的一种库存退库过程的示意图,如图5所示,通过redis执行lua脚本,实现库存减一,然后判断库存是否大于等于0,若否,返回秒杀失败或秒杀结束的提示信息,若是,则进行条件检查,所述条件检查包括后置条件检查,检查不通过的,则返回秒杀失败的提示信息,并进行退库操作,后置条件检查成功后,下单出货,然后判断是否支付失败等,若否,则秒杀成功,若是,进行退库操作。[0073]本发明提供的秒杀处理方法,通过若判断扣减后的库存数量不大于等于0,返回秒杀结束信息;若判断扣减后的库存数量大于等于0,则继续判断所述秒杀请求是否满足预设后置条件;若是,输出扣减成功指令;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息;在所述根据所述扣减成功指令生成秒杀订单之后,判断用户支付是否成功;若是,秒杀成功;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息;即本发明示例通过使用redis的lua脚本,来实现库存扣减,保证扣减过程的原子性,不至于出现多扣和少扣的情况,提高了库存扣减的精准度。[0074]第二方面,本发明示例提供了一种秒杀处理系统,图6为本发明提供的一种秒杀处理系统的结构示意图,如图6所示,该秒杀处理系统包括:[0075]库存信息初始化模块10,用于从数据库中查询秒杀活动的库存信息,并将所述库存信息加载至redis缓存中,所述库存信息包括库存数量;第一处理模块20,用于接收并响应于秒杀请求,redis执行lua脚本对redis缓存中的库存数量进行扣减,并判断扣减后的库存数量是否大于等于0,若是,输出扣减成功指令;第二处理模块30,用于根据所述扣减成功指令生成秒杀订单,并更新数据库中的库存信息。[0076]在其他可选的实施方式中,所述第一处理模块20具体用于:接收秒杀请求,判断所述秒杀请求是否满足预设前置条件,若是,响应所述秒杀请求。[0077]在其他可选的实施方式中,所述第一处理模块20,还用于:若判断扣减后的库存数量不大于等于0,返回秒杀结束信息。[0078]在其他可选的实施方式中,所述第一处理模块20,还用于在判断扣减后的库存数量大于等于0之后,判断所述秒杀请求是否满足预设后置条件;若是,输出扣减成功指令;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息。[0079]在其他可选的实施方式中,所述第二处理模块30还用于在根据所述扣减成功指令生成秒杀订单之后,判断用户支付是否成功;若是,秒杀成功;若否,对redis缓存中的库存数量进行退库操作,并返回秒杀失败信息。[0080]在其他可选的实施方式中,所述预设前置条件包括以下至少一种:用户限制、秒杀时间或者智能限流。[0081]所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的控制设备的具体工作过程以及相应的有益效果,可以参考前述方法示例中的对应过程,在此不再赘述。[0082]本发明提供的秒杀处理系统,通过库存信息初始化模块从数据库中查询秒杀活动的库存信息,并将所述库存信息加载至redis缓存中,所述库存信息包括库存数量;第一处理模块接收并响应于秒杀请求,redis执行lua脚本对redis缓存中的库存数量进行扣减,并判断扣减后的库存数量是否大于等于0,若是,输出扣减成功指令;第二处理模块根据所述扣减成功指令生成秒杀订单,并更新数据库中的库存信息;即本发明示例通过将库存数量加载至redis缓存中,通过redis执行lua脚本来实现库存扣减,保证扣减过程的原子性,不至于出现多扣和少扣的情况,提高了库存扣减的精准度。[0083]本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。[0084]最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1