高并发快响应的秒杀库存精准扣减的方法、装置及系统与流程

文档序号:14654041发布日期:2018-06-08 22:42阅读:549来源:国知局
本发明涉及计算机技术及软件领域,尤其涉及一种高并发快响应的秒杀库存精准扣减的方法、装置及系统。
背景技术
::秒杀抢购促销活动日益成为电商公司吸引用户注册及提升用户活跃度的重要手段。其中,秒杀库存是否精确扣减是衡量秒杀系统是否可靠运行的关键指标。秒杀活动开始前,通常会根据商品ID(以下简称“SKUID”)创建一个秒杀促销活动(一个秒杀促销活动对应一个促销ID,以下简称“PromoID”),设定秒杀开始结束时间、秒杀价格、秒杀库存等信息。现有技术中,秒杀库存(以下简称“stock”)的初始化存储及扣减方式主要分为以下几种:方式1:秒杀活动开始前,将秒杀库存初始化并存入库存数据库。秒杀活动开始时,库存的扣减步骤:第一步,查询PromoID对应的库存stock;第二步,当库存stock>0时,updatestock=stock-1,否则抢购失败;第三步,插入订单数据库生成用户订单信息,若插入失败,则回退库存updatestock=stock+1,否则抢购成功。具体流程如图1所示。方式2:秒杀活动开始前,将秒杀库存初始化并存入库存缓存队列,秒杀活动开始时,库存的扣减步骤:第一步,获取PromoID对应的库存stock;第二步,当库存stock>0时,setstock=stock-1,否则抢购失败;第三步,当库存stock<0时,抢购失败,否则进入第四步,插入订单数据库生成用户订单信息,若插入失败,则回退库存setstock=stock+1,否则抢购成功。具体流程如图2所示。但是,上述秒杀库存存储及扣减的方式或多或少存在一些不足之处,尤其是在高并发大流量的用户抢购请求下,库存将出现少扣或多扣现象,造成秒杀活动出现超卖或少卖的结果。具体如下:方式1中:秒杀库存stock存储于关系型数据库,受制于连接数及数据库自身的限制,在高并发请求下,数据库性能将急剧下降甚至出现异常,导致查询及更新库存失败。另外,方式1的库存扣减逻辑在高并发下将导致库存多扣的风险,造成多扣的原因参见图3:若T1-T2时刻之间,并发请求A、B、C查询库存stock==1即有库存,此时分别进行库存扣减,由于库存扣减操作需要锁行,即同一时刻,仅有一个请求获得行锁,进而请求A、B、C将按顺序以串行的方式对库存进行扣减,最终将库存扣减为负数并抢购成功,显然出现库存多扣即超卖现象。方式2中:相较于方式1而言,将秒杀库存存储于key-value的缓存队列中带来的明显好处是:在高并发场景下,查询及扣减库存几乎不会对缓存性能产生影响,进而能够有力地支撑秒杀系统的正常运行。同时,为了解决库存多扣问题,在方式1的基础上,增加了库存扣减更新后的判断逻辑,进而避免了出现超卖的现象,如图4所示。但是,方式2也存在明显的不足之处:若用户扣减存库成功但用户信息插入订单数据库失败,则会回退库存,此时库存stock+1之后仍然为负数,如若下个请求D进来时判断库存数量小于0,则抢购失败,即出现了少卖现象。如图5所示。技术实现要素:有鉴于此,本发明提供一种高并发快响应的秒杀库存精准扣减的方法、装置及系统,能够解决高并发大流量的用户抢购场景下出现的库存少扣或多扣问题。为实现上述目的,根据本发明的一个方面,提供了一种高并发快响应的秒杀库存精准扣减的方法。本发明的一种高并发快响应的秒杀库存精准扣减的方法包括:根据秒杀活动的库存数量,初始化生成相应个数的具有唯一标示值的token,并将所述token保存在Redis缓存队列中;如果根据用户购买请求,从Redis缓存队列中获取到token,则将用户信息插入订单数据库,若插入成功则库存扣减成功,所述用户信息包括用户标识信息以及用户下单信息;若插入失败,则库存扣减失败,将获取的token回退至Redis缓存队列。可选地,所述方法还包括:从Redis缓存队列中获取到token之后,将用户获取记录存入token分发表中,所述用户获取记录包括用户标识信息以及获取的token。可选地,所述方法还包括:若插入失败,则除将获取到的token回退至Redis缓存队列之外,还将相应的用户获取记录从token分发表中删除。可选地,所述方法还包括:将用户获取记录存入token分发表中之前,校验用户标识信息,若所述用户标识信息已存在于token分发表中,则提示扣减失败,且不予保存所述用户获取记录,并将获取到的token回退至Redis缓存队列中。可选地,所述token分发表为Redis哈希表。可选地,所述方法还包括:采用乐观锁机制,同一时刻只处理一个从Redis缓存队列中获取token的操作;以及将获取到的token回退至Redis缓存队列中时,若同时有多个回退操作请求,则阻塞等待,以确保所有token回退成功。为实现上述目的,根据本发明的另一方面,提供了一种高并发快响应的秒杀库存精准扣减的装置。本发明的一种高并发快响应的秒杀库存精准扣减的装置包括:库存初始化模块,用于根据秒杀活动的库存数量,初始化生成相应个数的token,并将所述token保存在Redis缓存队列中;库存扣减模块,用于如果根据用户购买请求,从Redis缓存队列中获取到token,则将用户信息插入订单数据库,若插入成功则库存扣减成功,所述用户信息包括用户标识信息以及用户下单信息;库存回退模块,用于若插入失败,则库存扣减失败,将获取的token回退至Redis缓存队列。可选地,所述库存扣减模块还用于:从Redis缓存队列中获取到token之后,将用户获取记录存入token分发表中,所述用户获取记录包括用户标识信息以及获取的token。可选地,所述装置还用于:若插入失败,则除了库存回退模块将获取到的token回退至Redis缓存队列之外,所述库存扣减模块还将相应的用户获取记录从token分发表中删除。可选地,所述装置还包括:用户限购模块,用于在库存扣减模块将用户获取记录存入token分发表中之前,校验用户标识信息,若所述用户标识信息已存在于token分发表中,则提示扣减失败,所述库存扣减模块不予保存所述用户获取记录,并由库存回退模块将获取到的token回退至Redis缓存队列中。可选地,所述token分发表为Redis哈希表。可选地,所述装置还用于:所述库存扣减模块采用乐观锁机制,同一时刻只处理一个从Redis缓存队列中获取token的操作;以及所述库存回退模块将获取到的token回退至Redis缓存队列中时,若同时有多个回退操作请求,则阻塞等待,以确保所有token回退成功。为实现上述目的,根据本发明的再一方面,提供了一种高并发快响应的秒杀库存精准扣减的系统。本发明的一种高并发快响应的秒杀库存精准扣减的系统包括:存储器和处理器,其中,所述存储器用于存储指令;所述处理器被配置为根据所述指令执行下列动作:根据秒杀活动的库存数量,初始化生成相应个数的具有唯一标示值的token,并将所述token保存在Redis缓存队列中;如果根据用户购买请求,从Redis缓存队列中获取到token,则将用户信息插入订单数据库,若插入成功则库存扣减成功,所述用户信息包括用户标识信息以及用户下单信息;若插入失败,则库存扣减失败,将获取的token回退至Redis缓存队列。根据本发明的技术方案,通过在高并发大流量的用户抢购场景下,利用缓存队列及具有唯一标示值的token技术实现快速响应的秒杀库存精确扣减,从而可以有效解决少卖或超卖问题;通过利用哈希表存储token,从而可以实现用户限购策略,避免同一用户购买多次的现象;通过在用户信息插入订单数据库失败时,将token回退至缓存队列中,从而可以有效避免少卖现象的发生;通过利用乐观锁以及阻塞等待机制,从而可以保证token获取和token回退的准确性。附图说明附图用于更好地理解本发明,不构成对本发明的不当限定。其中:图1是现有技术的库存扣减方式1的库存扣减示意图;图2是现有技术的库存扣减方式2的库存扣减示意图;图3是现有技术的库存扣减方式1的超卖原因分析图;图4是现有技术的库存扣减方式2的防超卖分析图;图5是现有技术的库存扣减方式2的少卖原因分析图;图6是根据本发明实施例的高并发快响应的秒杀库存精准扣减的方法的主要步骤的示意图;图7是根据本发明实施例的高并发快响应的秒杀库存精准扣减的方法的流程框图;图8是根据本发明实施例的高并发快响应的秒杀库存精准扣减的方法的库存token创建示意图;图9是根据本发明实施例的高并发快响应的秒杀库存精准扣减的方法的库存扣减示意图;图10是根据本发明实施例的高并发快响应的秒杀库存精准扣减的方法的库存回退示意图;图11是根据本发明实施例的高并发快响应的秒杀库存精准扣减的方法的用户限购示意图;图12是根据本发明实施例的高并发快响应的秒杀库存精准扣减的装置的主要模块的示意图;图13是根据本发明实施例的高并发快响应的秒杀库存精准扣减的系统的主要部分的示意图。具体实施方式以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。本发明实施例的技术方案主要是解决高并发大流量的用户抢购场景下出现的库存少扣或多扣问题。图6是根据本发明实施例的高并发快响应的秒杀库存精准扣减的方法的主要步骤的示意图。如图6所示,本发明实施例的高并发快响应的秒杀库存精准扣减的方法主要包括如下步骤:步骤S61:根据秒杀活动的库存数量,初始化生成相应个数的具有唯一标示值的token(令牌,一种凭据,具有唯一标示作用),并将所述token保存在Redis缓存队列中。本步骤的目的在于完成库存的初始化。在步骤S61的库存初始化完成之后,从步骤S62开始实施扣减。步骤S62:如果根据用户购买请求,从Redis缓存队列中获取到token,则将用户信息插入订单数据库,若插入成功则库存扣减成功,所述用户信息包括用户标识信息以及用户下单信息。本步骤是为了实现根据用户的购买请求,对库存的实时精准扣减。其中,从Redis缓存队列中获取到token之后,还可以将用户获取记录存入token分发表中,所述用户获取记录包括用户标识信息以及获取的token,以实时记录库存扣减情况。根据秒杀活动通常具有的用户限购特定,本发明实施例的高并发快响应的秒杀库存精准扣减的方法中,还可以包括将用户获取记录存入token分发表中之前,校验用户标识信息,若所述用户标识信息已存在于token分发表中,则提示扣减失败,且不予保存所述用户获取记录,并将获取到的token回退至Redis缓存队列中。步骤S63:若步骤S62中插入订单数据库失败,则库存扣减失败,将获取的token回退至Redis缓存队列。此外,若插入失败,除了将获取到的token回退至Redis缓存队列之外,还将相应的用户获取记录从token分发表中删除。在上述描述中,token分发表可以为Redis哈希表。其中,上述描述中,在需要从缓存队列中获取token时,通常可以采用乐观锁机制,同一时刻只处理一个从Redis缓存队列中获取token的操作,以确保token扣减的精准,避免商品超卖现象的发生;以及在需要将获取到的token回退至Redis缓存队列中时,若同时有多个回退操作请求,则阻塞等待,以确保所有token回退成功,以避免商品烧麦现象的出现。本发明实施例中,高并发快响应的秒杀库存精准扣减的方法主要是利用高并发快响应的秒杀库存精准扣减的装置进行。高并发快响应的秒杀库存精准扣减的装置主要可以包括三个模块:库存初始化模块、库存扣减模块以及库存回退模块,此外,还可以包括用户限购模块。首先根据库存数量stock,生成相应个数的token,并存入Redis缓存队列从而完成库存的初始化。秒杀开始时,库存数量stock的扣减转换成为token的扣减。若未获取到token,则抢购失败;若成功获取token代表获得了抢购资格,则将用户信息插入订单数据库,若入库成功则代表抢购成功,若入库失败,则抢购失败,同时将获取到的token回退至Redis缓存队列。但利用秒杀活动通常具有根据用户的身份标识,例如pin(personalidentificationnumber,个人身份识别号),进行限pin限购1件的特点,在获取到token后,通常会对同一PromoID的抢购用户做限购校验处理,若用户已经购买过,则将回退token并提示用户抢购失败。总体框图如图7所示。以下结合高并发快响应的秒杀库存精准扣减的装置的各模块所起的作用,对本发明实施例的高并发快响应的秒杀库存精准扣减的方法的主要流程进行详细介绍。库存初始化模块:记录运营人员设置的秒杀库存数量stock,循环调用通用唯一识别码UUID(UniversallyUniqueIdentifier)等唯一标示值生成算法,生成具有通用唯一标示数值的token(token便于日志分析),并将其存入Redis缓存队列。同时,将token写入日志文件token_log便于秒杀活动结束时核对。从而完成库存数量stock到token的一一映射,使得token的数量和stock保持一致。如图8所示。库存扣减模块:Redis缓存队列所采用的底层数据结构支持对token进行高并发地取出操作。根据用户的高并发请求,采用LPOP(LeftPOP,即从队列左边移除一个元素,也称为移除并返回队列中首个元素)指令,将token从队列中取出,由于LPOP采用乐观锁保障线程安全,即同一时刻只允许一个线程取得token,其他线程排队等待,避免多个线程同一时刻取得同一个token,进而有效规避超卖问题。详细的扣减步骤如下:秒杀活动开始时,采用LPOP机制,从Redis缓存队列中取出token,若为NIL(无值,为空),则抢购失败,否则进行是否已购买判断逻辑,若通过,则将用户信息插入订单数据库中中,例如可以保存至订单信息表userInfo_table,若插入userInfo_table成功,则抢购成功。如图9所示。库存回退模块:若用户获取token成功但插入订单信息表userInfo_table失败,则删除token分发表中相应的用户token领取记录,同时需将token回退至Redis缓存队列。采用RPUSH(RightPUSH,即从队列右边插入一个元素,也称为从队尾插入一个元素)将token回退,由于RPUSH指令采用阻塞访问的方式,当多个线程同时将token回退至Redis缓存队列时,会阻塞等待直到插入成功后才返回。此方式完全模拟现实场景的库存回退方式,能够解决现有技术的方式2中采用库存数量扣减方式出现的库存回退失败问题,有效规避了少卖现象。过程如图10所示。用户限购模块:由于秒杀活动通常需要限pin限购,即对于同一个秒杀活动,一个用户只能购买一件。本发明实施例中,可以利用Redis哈希表作为token分发表,即采用promoID-pin-token_value的数据结构做限pin限购处理。将promoID-pin作为哈希键key,当用户取得token后即可生成一条记录存入token分发表,当同一个用户第二次试图插入该表时,由于promoID-pin哈希键key对应的值token_value已经存在,表示用户已抢购过一次,则插入token分发表失败,进而有效规避同一pin购买多次的问题。过程如图11所示。根据本发明实施例的高并发快响应的秒杀库存精准扣减的方法可以看出,通过在高并发大流量的用户抢购场景下,利用缓存队列及具有唯一标示值的token技术实现快速响应的秒杀库存精确扣减,从而可以有效解决少卖或超卖问题;通过利用哈希表存储token,从而可以实现用户限购策略,避免同一用户购买多次的现象;通过在用户信息插入订单数据库失败时,将token回退至缓存队列中,从而可以有效避免少卖现象的发生;通过利用乐观锁以及阻塞等待机制,从而可以保证token获取和token回退的准确性。图12是根据本发明实施例的高并发快响应的秒杀库存精准扣减的装置的主要模块的示意图。如图12所示,本发明实施例的高并发快响应的秒杀库存精准扣减的装置120主要包括如下模块:库存初始化模块121、库存扣减模块122、以及库存回退模块123,其中,库存初始化模块121用于根据秒杀活动的库存数量,初始化生成相应个数的token,并将所述token保存在Redis缓存队列中;库存扣减模块122用于如果根据用户购买请求,从Redis缓存队列中获取到token,则将用户信息插入订单数据库,若插入成功则库存扣减成功,所述用户信息包括用户标识信息以及用户下单信息;库存回退模块123用于若插入失败,则库存扣减失败,将获取的token回退至Redis缓存队列。其中,库存扣减模块122还可用于:从Redis缓存队列中获取到token之后,将用户获取记录存入token分发表中,所述用户获取记录包括用户标识信息以及获取的token。所述token分发表可以但不限于为Redis哈希表。装置120还可用于:若插入失败,则除了库存回退模块将获取到的token回退至Redis缓存队列之外,所述库存扣减模块还将相应的用户获取记录从token分发表中删除。此外,装置120还可包括:用户限购模块(图中未示出),用于在库存扣减模块将用户获取记录存入token分发表中之前,校验用户标识信息,若所述用户标识信息已存在于token分发表中,则提示扣减失败,所述库存扣减模块不予保存所述用户获取记录,并由库存回退模块将获取到的token回退至Redis缓存队列中。装置120还可用于:所述库存扣减模块采用乐观锁机制,同一时刻只处理一个从Redis缓存队列中获取token的操作;以及所述库存回退模块将获取到的token回退至Redis缓存队列中时,若同时有多个回退操作请求,则阻塞等待,以确保所有token回退成功。图13是根据本发明实施例的高并发快响应的秒杀库存精准扣减的系统的主要部分的示意图。如图13所示,本发明实施例的高并发快响应的秒杀库存精准扣减的系统130主要包括:存储器131和处理器132,其中,存储器131用于存储指令;处理器132被配置为根据所述指令执行下列动作:根据秒杀活动的库存数量,初始化生成相应个数的具有唯一标示值的token,并将所述token保存在Redis缓存队列中;如果根据用户购买请求,从Redis缓存队列中获取到token,则将用户信息插入订单数据库,若插入成功则库存扣减成功,所述用户信息包括用户标识信息以及用户下单信息;若插入失败,则库存扣减失败,将获取的token回退至Redis缓存队列。从以上描述可以看出,通过在高并发大流量的用户抢购场景下,利用缓存队列及具有唯一标示值的token技术实现快速响应的秒杀库存精确扣减,从而可以有效解决少卖或超卖问题;通过利用哈希表存储token,从而可以实现用户限购策略,避免同一用户购买多次的现象;通过在用户信息插入订单数据库失败时,将token回退至缓存队列中,从而可以有效避免少卖现象的发生;通过利用乐观锁以及阻塞等待机制,从而可以保证token获取和token回退的准确性。上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1