一种秒杀场景的库存扣减解决方法及系统与流程

未命名 10-22 阅读:74 评论:0


1.本发明涉及库存扣减领域,具体而言,涉及一种秒杀场景的库存扣减解决方法及系统。


背景技术:

2.随着互联网商业的发展,营销方式层出不穷,互联网行业存在大量针对秒杀场景的营销抢券活动,例如给用户发送消费券、超市券、话费券和水电煤券等权益来刺激和推动国家的经济发展,其不仅强依赖抢券链路的高并发、高可用和高稳定,且在初期设计时必须全面考虑抢券的用户体验以及活动业务复杂性。
3.特别的,在抢券活动库存扣减方面,在高并发场景下,由于用户群体广、并发量大,库存扣减方案需要设计的更加完善,避免资源存在瓶颈、资源严重浪费,库存超卖和数据单热点问题,不仅会造成性能严重下降,还会影响用户抢券体验。
4.因此,如何设计一种基于电信营销业务的秒杀库存扣减解决方法及系统,使其在高并发、高可用和高稳定的秒杀场景下,合理完善的秒杀库存扣减方案,提升系统性能、优化用户体验、解决资源浪费和避免单点瓶颈,是目前的主要发明难点之一。


技术实现要素:

5.本发明的目的在于提供一种秒杀场景的库存扣减解决方法,其能够在高并发、高可用和高稳定的秒杀场景下,避免资源浪费和单点瓶颈的问题,提高系统性能并优化用户体验。
6.本发明的另一目的在于提供一种秒杀场景的库存扣减解决系统,其能够在高并发、高可用和高稳定的秒杀场景下,避免资源浪费和单点瓶颈的问题,提高系统性能并优化用户体验。
7.本发明的实施例是这样实现的:
8.第一方面,本技术实施例提供一种秒杀场景的库存扣减解决方法,其包括如下步骤,s1、主活动成本localcache:采用秒杀活动配置生效时,配置平台发送活动生效kafka获取秒杀活动的成本配置信息;以主活动成本key为主活动号main_relationid,value为true或者false,配置初始化时默认为true;通过zookeeper通知多个服务器节点,各节点收到通知后落本节点的主活动localcache;s2、子活动成本localcache:动态的从apollo获取活动拆分份数n,将活动成本平均拆分为n份relationid_1...n;以子活动成本key为主活动号relationid,value为子活动成本列表relationid_1...n;所述子活动成本列表通过zookeeper通知多个服务器节点,各节点收到通知之后落本节点子活动成本的localcache,并将该子活动成本作为活动有效成本节点;s3、子活动成本redis扣减:查询主活动localcache,获取主活动流量控制开关,判断开关是否为true,如果为ture时进行子活动成本扣减,查询子活动localcache获取该主活动下的子活动列表relationid_1...n后,通过随机算法获取其中一个有效的子节点成本信息,将该子节点拆分好的成本以及要扣减的值
交给reids做incrbyandcheck,redis中结合lua脚本执行eval命令,当扣减失败时,优先在当前服务器节点的子活动localcache中把当前子节点移除,并且通过zookeeper广播通知其他服务器节点对当前子节点进行移除;s4、主子活动联动解决redis热点问题:当大批流量进来时,优先从localcache中获取主活动的流量开关,主活动的开关校验通过后,从localcache中获取子活动的成本relationid_1...n,判断子活动列表是否为空,如果列表为空则这台服务器的活动成本已经用完,此时直接返回无成本,如果列表还有值,根据列表中子节点的个数进行随机取值,获取有成本的子活动;s5、主活动成本开关同步:通过spring原生的定时任务,运用spring自带的注解@enablescheduling开启对计划任务的支持,通过@scheduled申明任务,cron约定定时任务执行频率,供各服务器节点执行该任务,查询子活动localcache中是否还有子活动成本信息,如果子活动列表为空,证明该活动已无成本,每个服务器节点更新本节点中主活动localcache的开关为false,如果子活动列表不为空,则主活动成本信息开关保持不变。
9.在本发明的一些实施例中,上述步骤s3中,随机取子节点基础编码包括threadlocalrandom.current().nextint(subactivityidlist.size())。
10.在本发明的一些实施例中,上述步骤s3中,redis和lua结合原子操作包括eval script numkeys key[key

]arg[arg

];其中script参数为一段lua5.1脚本程序,numkeys为key的个数,key[key

]表示在脚本中所用到的redis键key,arg[arg

]表示附加参数,其在lua脚本中通过argv[1],argv[2]获取。
[0011]
在本发明的一些实施例中,上述步骤s4中,将拆分后的其中一个成本进行redis操作后,redis热点key拆分为n个reids key进行成本累加操作。
[0012]
在本发明的一些实施例中,上述步骤s4中,当子节点累加完成,子活动列表为空后,在服务器子活动的localcache列表把当前用完成本的节点删除。
[0013]
在本发明的一些实施例中,上述步骤s4中,把当前用完成本的节点删除后,再利用zookeeper的广播能力同步于其他服务器节点。
[0014]
第二方面,本技术实施例提供一种秒杀场景的库存扣减解决系统,其包括,主活动成本模块:采用秒杀活动配置生效时,配置平台发送活动生效kafka获取秒杀活动的成本配置信息;以主活动成本key为主活动号main_relationid,value为true或者false,配置初始化时默认为true;通过zookeeper通知多个服务器节点,各节点收到通知后落本节点的主活动localcache;子活动成本模块:动态的从apollo获取活动拆分份数n,将活动成本平均拆分为n份relationid_1...n;以子活动成本key为主活动号relationid,value为子活动成本列表relationid_1...n;所述子活动成本列表通过zookeeper通知多个服务器节点,各节点收到通知之后落本节点子活动成本的localcache,并将该子活动成本作为活动有效成本节点;子活动成本扣减模块:查询主活动localcache,获取主活动流量控制开关,判断开关是否为true,如果为ture时进行子活动成本扣减,查询子活动localcache获取该主活动下的子活动列表relationid_1...n后,通过随机算法获取其中一个有效的子节点成本信息,将该子节点拆分好的成本以及要扣减的值交给reids做incrbyandcheck,redis中结合lua脚本执行eval命令,当扣减失败时,优先在当前服务器节点的子活动localcache中把当前子节点移除,并且通过zookeeper广播通知其他服务器节点对当前子节点进行移除;主子活动联动模块:当大批流量进来时,优先从localcache中获取主活动的流量开关,主活动的开关
校验通过后,从localcache中获取子活动的成本relationid_1...n,判断子活动列表是否为空,如果列表为空则这台服务器的活动成本已经用完,此时直接返回无成本,如果列表还有值,根据列表中子节点的个数进行随机取值,获取有成本的子活动;主活动开关同步模块:通过spring原生的定时任务,运用spring自带的注解@enablescheduling开启对计划任务的支持,通过@scheduled申明任务,cron约定定时任务执行频率,供各服务器节点执行该任务,查询子活动localcache中是否还有子活动成本信息,如果子活动列表为空,证明该活动已无成本,每个服务器节点更新本节点中主活动localcache的开关为false,如果子活动列表不为空,则主活动成本信息开关保持不变。
[0015]
相对于现有技术,本发明的实施例至少具有如下优点或有益效果:
[0016]
本技术实施例在秒杀活动业务场景下实现库存扣减方案,其中以成本作为热点数据,在成本扣减时采用redis的原子化incrbyandcheck能力,解决了在高并发场景下redis有单点瓶颈的问题,采用主活动+子活动联动,主活动成本key为主活动号(main_relationid)value为true或者false,同时将活动成本拆分为n份子活动(relationid_1...n),子活动key为主活动号,value为子活动列表(relationid_1...n),n是由活动开展前人工配置到apollo配置平台。当活动配置生效,通过上面的计算方式,把活动成本进行动态的拆分,并且把主子活动成本信息同步于主子活动localcache,这样可以解决redis热点问题。主活动用于成本库存redis扣减前流量限制,在每次秒杀交互时做主活动成本判断,当限制开关为false时就会将请求拦截,当开关为ture就会进行子活动的扣减。子活动用于redis库存扣减,每次扣减时从localcache中获取该主活动还有成本的子活动列表,如果列表为空默认没有成本,将请求拦截,如果列表不为空将随机取出一个子活动来做redis的incrbyandcheck,当该子活动已经没有成本时,采用zookeeper广播通知的形式,将该子节点成本信息从子活动列表中移除。主活动成本控制开关通过定时任务去查询该节点的本地缓存是否还有子活动列表,如果为空就会将localcache中主活动开关置为false,并且达到无感化执行,大幅提高性能。
附图说明
[0017]
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
[0018]
图1为本发明实施例1秒杀场景的库存扣减解决方法的流程图;
[0019]
图2为本发明实施例步骤s1中主活动成本的流程图;
[0020]
图3为本发明实施例步骤s2中子活动成本的流程图;
[0021]
图4为本发明实施例步骤s3中活动库存扣减的流程图;
[0022]
图5为本发明实施例2秒杀场景的库存扣减解决系统的原理图。
具体实施方式
[0023]
为使本技术实施例的目的、技术方案和优点更加清楚,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是
本技术一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本技术实施例的组件可以以各种不同的配置来布置和设计。
[0024]
下面结合附图,对本技术的一些实施方式作详细说明。在不冲突的情况下,下述的各个实施例及实施例中的各个特征可以相互组合。
[0025]
实施例1
[0026]
请参阅图1~图4,图1~图4所示为本技术实施例提供的秒杀场景的库存扣减解决方法的示意图。秒杀场景的库存扣减解决方法,其包括如下步骤,s1、主活动成本localcache:采用秒杀活动配置生效时,配置平台发送活动生效kafka获取秒杀活动的成本配置信息;以主活动成本key为主活动号main_relationid,value为true或者false,配置初始化时默认为true;通过zookeeper通知多个服务器节点,各节点收到通知后落本节点的主活动localcache;s2、子活动成本localcache:动态的从apollo获取活动拆分份数n,将活动成本平均拆分为n份relationid_1...n;以子活动成本key为主活动号relationid,value为子活动成本列表relationid_1...n;所述子活动成本列表通过zookeeper通知多个服务器节点,各节点收到通知之后落本节点子活动成本的localcache,并将该子活动成本作为活动有效成本节点;s3、子活动成本redis扣减:查询主活动localcache,获取主活动流量控制开关,判断开关是否为true,如果为ture时进行子活动成本扣减,查询子活动localcache获取该主活动下的子活动列表relationid_1...n后,通过随机算法获取其中一个有效的子节点成本信息,将该子节点拆分好的成本以及要扣减的值交给reids做incrbyandcheck,redis中结合lua脚本执行eval命令,当扣减失败时,优先在当前服务器节点的子活动localcache中把当前子节点移除,并且通过zookeeper广播通知其他服务器节点对当前子节点进行移除;s4、主子活动联动解决redis热点问题:当大批流量进来时,优先从localcache中获取主活动的流量开关,主活动的开关校验通过后,从localcache中获取子活动的成本relationid_1...n,判断子活动列表是否为空,如果列表为空则这台服务器的活动成本已经用完,此时直接返回无成本,如果列表还有值,根据列表中子节点的个数进行随机取值,获取有成本的子活动;s5、主活动成本开关同步:通过spring原生的定时任务,运用spring自带的注解@enablescheduling开启对计划任务的支持,通过@scheduled申明任务,cron约定定时任务执行频率,供各服务器节点执行该任务,查询子活动localcache中是否还有子活动成本信息,如果子活动列表为空,证明该活动已无成本,每个服务器节点更新本节点中主活动localcache的开关为false,如果子活动列表不为空,则主活动成本信息开关保持不变。
[0027]
步骤s1主活动成本localcache中,zookeeper广播可以保证每个节点都可以收到广播,并且可以及时更新本地缓存中的信息,用于活动流量总体控制。步骤s2子活动成本localcache中,采用秒杀活动配置生效时,配置平台发送活动生效kafka获取秒杀活动具体的成本配置信息,动态的从apollo获取活动拆分份数n,将活动成本平均拆分为n份relationid_1...n,子活动成本key为主活动号relationid,value为子活动列表relationid_1...n。步骤s3子活动成本redis扣减中,活动库存扣减时,先查询主活动localcache,获取主活动流量控制开关,判断开关是否为true,如果为ture就进行子活动成本扣减,查询子活动localcache获取该主活动下有效的还有成本的子活动列表relationid_1...n,获取到列表之后,通过随机算法获取其中一个有效的子节点成本信息,
将该子节点拆分好的成本以及要扣减的值交给reids来做incrbyandcheck,redis中结合lua脚本执行eval命令,保证redis的原子化,当扣减失败时,证明当前子节点已经没有成本,优先在当前服务器节点的子活动localcache中把当前子节点移除,并且通过zookeeper广播通知其他服务器节点对当前子节点进行移除。
[0028]
s4主子活动联动解决redis热点问题中,秒杀活动用户量大和并发高时,活动成本在redis中做累加动作,成本就会成为一个热点key,在上述步骤s1主活动成本拆分和步骤s2子活动拆分中,已经把活动进行拆分,把活动成本拆分为n份relationid_1...n,放置于服务器的本地缓存localcache中,当大批流量进来时,优先localcache中获取主活动的流量开关。因为采用的是服务器本身的资源,用的是物理机的内存,把采用充分的利用起来,这样避免了之前直接对下层redis资源的访问,减轻了redis的压力,主活动的开关校验通过之后,从localcache中获取子活动的成本,就是在步骤s2中拆分成的n份,查询之后,会判断得到子活动列表是否为空,如果列表为空证明这台服务器的活动成本已经用完了,就可以直接返回无成本,如果列表还有值时,我们根据列表中子节点的个数进行随机取值,获取到有成本的子活动。
[0029]
s5主活动成本开关同步中,通过spring原生的定时任务,运用spring自带的注解@enablescheduling来开启对计划任务的支持,通过@scheduled来申明这是一个任务,cron来约定定时任务执行频率,保证每个服务器节点都可以执行该任务,查询子活动localcache中是否还有子活动成本信息,如果子活动列表为空,证明该活动已无成本,每个服务器节点更新本节点中主活动localcache的开关为false,如果子活动列表不为空,那主活动成本信息开关保持不变。
[0030]
本技术实施例在秒杀活动业务场景下实现库存扣减方案,其中以成本作为热点数据,在成本扣减时采用redis的原子化incrbyandcheck能力,解决了在高并发场景下redis有单点瓶颈的问题,采用主活动+子活动联动,主活动成本key为主活动号(main_relationid)value为true或者false,同时将活动成本拆分为n份子活动(relationid_1...n),子活动key为主活动号,value为子活动列表(relationid_1...n),n是由活动开展前人工配置到apollo配置平台。当活动配置生效,通过上面的计算方式,把活动成本进行动态的拆分,并且把主子活动成本信息同步于主子活动localcache,这样可以解决redis热点问题。主活动用于成本库存redis扣减前流量限制,在每次秒杀交互时做主活动成本判断,当限制开关为false时就会将请求拦截,当开关为ture就会进行子活动的扣减。子活动用于redis库存扣减,每次扣减时从localcache中获取该主活动还有成本的子活动列表,如果列表为空默认没有成本,将请求拦截,如果列表不为空将随机取出一个子活动来做redis的incrbyandcheck,当该子活动已经没有成本时,采用zookeeper广播通知的形式,将该子节点成本信息从子活动列表中移除。主活动成本控制开关通过定时任务去查询该节点的本地缓存是否还有子活动列表,如果为空就会将localcache中主活动开关置为false,并且达到无感化执行,大幅提高性能。
[0031]
在本发明的一些实施例中,上述步骤s3中,随机取子节点基础编码包括threadlocalrandom.current().nextint(subactivityidlist.size())。
[0032]
在本发明的一些实施例中,上述步骤s3中,redis和lua结合原子操作包括eval script numkeys key[key

]arg[arg

];其中script参数为一段lua5.1脚本程序,
numkeys为key的个数,key[key

]表示在脚本中所用到的redis键key,arg[arg

]表示附加参数,其在lua脚本中通过argv[1],argv[2]获取。
[0033]
在本发明的一些实施例中,上述步骤s4中,将拆分后的其中一个成本进行redis操作后,redis热点key拆分为n个reids key进行成本累加操作。
[0034]
在本发明的一些实施例中,上述步骤s4中,当子节点累加完成,子活动列表为空后,在服务器子活动的localcache列表把当前用完成本的节点删除。
[0035]
在本发明的一些实施例中,上述步骤s4中,把当前用完成本的节点删除后,再利用zookeeper的广播能力同步于其他服务器节点。
[0036]
例如,多个服务器节点包括服务器节点1、服务器节点2和服务器节点3,将活动成本平均拆分为3份,包括relationid_1、relationid_2和relationid_3。对拆分好的成本relationid_3进行redis操作,这样就把一个大的redis热点key拆分为n个reids key进行成本累加操作。当子节点relation_3累加完成,没有成本之后,在服务器子活动的localcache列表把当前用完成本的节点删除掉,再利用zookeeper的广播能力同步于其他服务器节点,这样我们的成本就会得到充分的控制,也对redis减轻了压力,成本redis也不在是热点数据。
[0037]
实施例2
[0038]
请参阅图5,图5为本技术实施例提供的秒杀场景的库存扣减解决系统,其包括,主活动成本模块:采用秒杀活动配置生效时,配置平台发送活动生效kafka获取秒杀活动的成本配置信息;以主活动成本key为主活动号main_relationid,value为true或者false,配置初始化时默认为true;通过zookeeper通知多个服务器节点,各节点收到通知后落本节点的主活动localcache;子活动成本模块:动态的从apollo获取活动拆分份数n,将活动成本平均拆分为n份relationid_1...n;以子活动成本key为主活动号relationid,value为子活动成本列表relationid_1...n;所述子活动成本列表通过zookeeper通知多个服务器节点,各节点收到通知之后落本节点子活动成本的localcache,并将该子活动成本作为活动有效成本节点;子活动成本扣减模块:查询主活动localcache,获取主活动流量控制开关,判断开关是否为true,如果为ture时进行子活动成本扣减,查询子活动localcache获取该主活动下的子活动列表relationid_1...n后,通过随机算法获取其中一个有效的子节点成本信息,将该子节点拆分好的成本以及要扣减的值交给reids做incrbyandcheck,redis中结合lua脚本执行eval命令,当扣减失败时,优先在当前服务器节点的子活动localcache中把当前子节点移除,并且通过zookeeper广播通知其他服务器节点对当前子节点进行移除;主子活动联动模块:当大批流量进来时,优先从localcache中获取主活动的流量开关,主活动的开关校验通过后,从localcache中获取子活动的成本relationid_1...n,判断子活动列表是否为空,如果列表为空则这台服务器的活动成本已经用完,此时直接返回无成本,如果列表还有值,根据列表中子节点的个数进行随机取值,获取有成本的子活动;主活动开关同步模块:通过spring原生的定时任务,运用spring自带的注解@enablescheduling开启对计划任务的支持,通过@scheduled申明任务,cron约定定时任务执行频率,供各服务器节点执行该任务,查询子活动localcache中是否还有子活动成本信息,如果子活动列表为空,证明该活动已无成本,每个服务器节点更新本节点中主活动localcache的开关为false,如果子活动列表不为空,则主活动成本信息开关保持不变。
[0039]
本技术实施例与实施例1的原理相同,在此不做重复描述。可以理解,图5所示的结构仅为示意,秒杀场景的库存扣减解决系统还可包括比图5中所示更多或者更少的组件,或者具有与图5所示不同的配置。图5中所示的各组件可以采用硬件、软件或其组合实现。
[0040]
在本技术所提供的实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本技术的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0041]
另外,在本技术各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
[0042]
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0043]
综上所述,本技术实施例提供的一种秒杀场景的库存扣减解决方法及系统:本技术实施例将成本配置信息放在服务器节点的本地缓存,可以充分的利用服务器的资源,提高性能;采用成本拆分方式,将成本拆分为n份,达到主子活动联动,随机取一个子节点进行成本扣减解决成本作为一个热点key造成的单点瓶颈,用redis以及lua脚本解决成本超卖问题通过利用zookeeper的广播订阅能力达到应用服务器信息共享,数据一致;通过spring注解式定时任务,让每一个节点都能执行任务,同时修改本节点的配置信息。
[0044]
以上所述仅为本技术的优选实施例而已,并不用于限制本技术,对于本领域的技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。

技术特征:
1.一种秒杀场景的库存扣减解决方法,其特征在于,包括如下步骤,s1、主活动成本localcache:采用秒杀活动配置生效时,配置平台发送活动生效kafka获取秒杀活动的成本配置信息;以主活动成本key为主活动号main_relationid,value为true或者false,配置初始化时默认为true;通过zookeeper通知多个服务器节点,各节点收到通知后落本节点的主活动localcache;s2、子活动成本localcache:动态的从apollo获取活动拆分份数n,将活动成本平均拆分为n份relationid_1...n;以子活动成本key为主活动号relationid,value为子活动成本列表relationid_1...n;所述子活动成本列表通过zookeeper通知多个服务器节点,各节点收到通知之后落本节点子活动成本的localcache,并将该子活动成本作为活动有效成本节点;s3、子活动成本redis扣减:查询主活动localcache,获取主活动流量控制开关,判断开关是否为true,如果为ture时进行子活动成本扣减,查询子活动localcache获取该主活动下的子活动列表relationid_1...n后,通过随机算法获取其中一个有效的子节点成本信息,将该子节点拆分好的成本以及要扣减的值交给reids做incrbyandcheck,redis中结合lua脚本执行eval命令,当扣减失败时,优先在当前服务器节点的子活动localcache中把当前子节点移除,并且通过zookeeper广播通知其他服务器节点对当前子节点进行移除;s4、主子活动联动解决redis热点问题:当大批流量进来时,优先从localcache中获取主活动的流量开关,主活动的开关校验通过后,从localcache中获取子活动的成本relationid_1...n,判断子活动列表是否为空,如果列表为空则这台服务器的活动成本已经用完,此时直接返回无成本,如果列表还有值,根据列表中子节点的个数进行随机取值,获取有成本的子活动;s5、主活动成本开关同步:通过spring原生的定时任务,运用spring自带的注解@enablescheduling开启对计划任务的支持,通过@scheduled申明任务,cron约定定时任务执行频率,供各服务器节点执行该任务,查询子活动localcache中是否还有子活动成本信息,如果子活动列表为空,证明该活动已无成本,每个服务器节点更新本节点中主活动localcache的开关为false,如果子活动列表不为空,则主活动成本信息开关保持不变。2.如权利要求1所述的一种秒杀场景的库存扣减解决方法,其特征在于,步骤s3中,随机取子节点基础编码包括threadlocalrandom.current().nextint(subactivityidlist.size())。3.如权利要求1所述的一种秒杀场景的库存扣减解决方法,其特征在于,步骤s3中,redis和lua结合原子操作包括eval script numkeys key[key

]arg[arg

];其中script参数为一段lua5.1脚本程序,numkeys为key的个数,key[key

]表示在脚本中所用到的redis键key,arg[arg

]表示附加参数,其在lua脚本中通过argv[1],argv[2]获取。4.如权利要求1所述的一种秒杀场景的库存扣减解决方法,其特征在于,步骤s4中,将拆分后的其中一个成本进行redis操作后,redis热点key拆分为n个reids key进行成本累加操作。
5.如权利要求4所述的一种秒杀场景的库存扣减解决方法,其特征在于,步骤s4中,当子节点累加完成,子活动列表为空后,在服务器子活动的localcache列表把当前用完成本的节点删除。6.如权利要求5所述的一种秒杀场景的库存扣减解决方法,其特征在于,步骤s4中,把当前用完成本的节点删除后,再利用zookeeper的广播能力同步于其他服务器节点。7.一种秒杀场景的库存扣减解决系统,其特征在于,包括,主活动成本模块:采用秒杀活动配置生效时,配置平台发送活动生效kafka获取秒杀活动的成本配置信息;以主活动成本key为主活动号main_relationid,value为true或者false,配置初始化时默认为true;通过zookeeper通知多个服务器节点,各节点收到通知后落本节点的主活动localcache;子活动成本模块:动态的从apollo获取活动拆分份数n,将活动成本平均拆分为n份relationid_1...n;以子活动成本key为主活动号relationid,value为子活动成本列表relationid_1...n;所述子活动成本列表通过zookeeper通知多个服务器节点,各节点收到通知之后落本节点子活动成本的localcache,并将该子活动成本作为活动有效成本节点;子活动成本扣减模块:查询主活动localcache,获取主活动流量控制开关,判断开关是否为true,如果为ture时进行子活动成本扣减,查询子活动localcache获取该主活动下的子活动列表relationid_1...n后,通过随机算法获取其中一个有效的子节点成本信息,将该子节点拆分好的成本以及要扣减的值交给reids做incrbyandcheck,redis中结合lua脚本执行eval命令,当扣减失败时,优先在当前服务器节点的子活动localcache中把当前子节点移除,并且通过zookeeper广播通知其他服务器节点对当前子节点进行移除;主子活动联动模块:当大批流量进来时,优先从localcache中获取主活动的流量开关,主活动的开关校验通过后,从localcache中获取子活动的成本relationid_1...n,判断子活动列表是否为空,如果列表为空则这台服务器的活动成本已经用完,此时直接返回无成本,如果列表还有值,根据列表中子节点的个数进行随机取值,获取有成本的子活动;主活动开关同步模块:通过spring原生的定时任务,运用spring自带的注解@enablescheduling开启对计划任务的支持,通过@scheduled申明任务,cron约定定时任务执行频率,供各服务器节点执行该任务,查询子活动localcache中是否还有子活动成本信息,如果子活动列表为空,证明该活动已无成本,每个服务器节点更新本节点中主活动localcache的开关为false,如果子活动列表不为空,则主活动成本信息开关保持不变。

技术总结
本发明提出了一种秒杀场景的库存扣减解决方法及系统,涉及库存扣减领域。包括采用秒杀活动配置生效时,平台发送活动生效kafka获取秒杀活动的成本配置信息;以主活动成本Key为主活动号,zookeeper通知多个服务器节点;从apollo获取活动拆分份数将活动成本均分;以子活动成本Key为主活动号;各节点将该子活动成本作为活动有效成本节点;查询主活动流量控制开关,开关为ture时进行子活动成本扣减,查询子活动获取子活动列表,通过随机算法获取其中有效子节点成本,将成本及需扣减值交给reids。其能够在高并发、高可用和高稳定的秒杀场景下,避免资源浪费和单点瓶颈的问题。避免资源浪费和单点瓶颈的问题。避免资源浪费和单点瓶颈的问题。


技术研发人员:蒲春春 胡文杰 徐原野 程晨 王帅 余昌昌
受保护的技术使用者:天翼电子商务有限公司
技术研发日:2023.05.25
技术公布日:2023/10/19
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

航空商城 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

评论

相关推荐