分享变量的发送方法、装置及计算机可读介质与流程

文档序号:27825760发布日期:2021-12-07 20:32阅读:88来源:国知局
分享变量的发送方法、装置及计算机可读介质与流程

1.本发明涉及通信技术领域,尤其涉及一种分享变量的发送方法、装置及计算机可读介质。


背景技术:

2.在现实生活中,经常有分配或发送分享信息的场景,其中分享信息可以为红包或游戏币等。比如:在部门庆祝活动中给部门的百人团队发红包庆祝,或者通过春晚等平台发红包的方式做产品推广。并且,接收分享信息的终端数量越多,会使得应用服务器以及数据库服务器的压力越大,当接收分享信息的终端超过一定数量,会导致分享信息分配失败、分配效率低以及精确率低的问题。


技术实现要素:

3.有鉴于此,本发明实施例提供一种分享变量的发送方法、装置及计算机可读介质,能够解决在高并发场景下分享变量的分配效率低以及精确率低的问题。
4.为实现上述目的,根据本发明实施例的一个方面,提供了一种分享变量的发送方法。
5.本发明实施例的分享变量的发送方法包括:
6.接收分配请求,所述分配请求携带有分享变量的分配总量以及分配数量;
7.根据所述分配请求,将所述分配总量按照所述分配数量拆分,以得到数量为所述分配数量的分享变量,并将所述分享变量依次缓存至redis队列中;
8.当所述redis队列存在未分配的分享变量时,每接收到一个接收终端发送的接收请求,依次从所述redis队列中取出一个分享变量并发送给所述接收终端。
9.可选地,所述将所述分享变量依次缓存至redis队列中,包括:
10.将所述分享变量对应的属性信息依次缓存至redis队列中,所述属性信息至少包括:所述分享变量的第一标识信息。
11.可选地,所述从所述redis队列中取出一个分享变量发送给所述接收终端的步骤之前,所述方法还包括:
12.当接收到第一接收终端发送的第一接收请求,获取哈希表;所述第一接收请求携带有第一接收终端的第二标识信息,所述哈希表存储有已成功被分配过分享信息的接收终端的标识信息;
13.根据所述第一接收终端的第二标识信息以及哈希表,确定所述第一接收请求是否为重复请求;
14.若所述第一接收请求不是重复请求,则执行从所述redis队列中取出一个分享变量发送给所述第一接收终端的步骤;
15.若所述第一接收请求是重复请求,则不再给所述第一接收终端发送分享信息,向所述第一接收终端发送分配失败的信息。
16.可选地,所述根据所述第一接收终端的第二标识信息以及哈希表,确定所述第一接收请求是否为重复请求,包括:
17.判断哈希表是否存储有所述第一接收终端的信息;
18.若所述哈希表未存储有所述第一接收终端的信息,则确定所述第一接收请求不是重复请求;
19.若所述哈希表存储有所述第一接收终端的信息,则确定所述第一接收请求是重复请求。
20.可选地,所述当所述redis队列存在未分配的分享变量时,每接收到一个接收终端发送的接收请求,依次从所述redis队列中取出一个分享变量并发送给所述接收终端,包括:
21.当所述redis队列存在未分配的分享变量且第一接收终端发送的第一接收请求不是重复请求时,从所述redis队列中取出第一分享变量并发送给所述第一接收终端;其中,所述第一分享变量是接收到所述第一接收请求时位于所述redis队列取出首位的分享变量;
22.若将分配信息成功记录到哈希表中,则所述第一分享变量分配完成,其中,所述分配信息用于表示所述第一分享变量与所述第一接收终端的分配关系的信息。
23.可选地,所述当所述redis队列存在未分配的分享变量时,每接收到一个接收终端发送的接收请求,依次从所述redis队列中取出一个分享变量并发送给所述接收终端,还包括:
24.在将所述分配信息记录到所述哈希表中时,将所述分配信息异步保存到数据库中。
25.可选地,所述方法还包括:
26.若未将所述分配信息成功记录到所述哈希表或所述数据库中,则将所述第一分享变量重新插入所述redis队列中,并删除所述哈希表和所述数据库中已经保存的所述第一分享信息的分配信息。
27.为实现上述目的,根据本发明实施例的又一个方面,提供了一种分享变量的发送装置。
28.本发明实施例的分享变量的发送装置包括:
29.初始化模块,用于接收分配请求,所述分配请求携带有分享变量的分配总量以及分配数量;根据所述分配请求,将所述分配总量按照所述分配数量拆分,以得到数量为所述分配数量的分享变量,并将所述分享变量依次缓存至redis队列中;
30.分配模块,用于当所述redis队列存在未分配的分享变量时,每接收到一个接收终端发送的接收请求,依次从所述redis队列中取出一个分享变量并发送给所述接收终端。
31.为实现上述目的,根据本发明实施例的再一个方面,提供了一种分享变量的发送装置。
32.本发明实施例的分享变量的发送装置包括:
33.一个或多个处理器;
34.存储装置,用于存储一个或多个程序,
35.当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理
器实现如上所述的方法。
36.为实现上述目的,根据本发明实施例的又一个方面,提供了一种计算机可读介质。
37.本发明实施例的计算机可读介质上存储有计算机程序,所述程序被处理器执行时实现如上所述的方法。
38.上述发明中的一个实施例具有如下优点或有益效果:
39.在本发明实施例中,在接收到接收请求之前,已经完成了分享变量的拆分,并将拆分得到的分享变量依次缓冲至redis队列中,每接收到一个接收终端发送的接收请求,依次从redis队列中取出一个分享变量发送给所述接收终端,这样可以保证在高并发的场景下高效且准确地分配分享变量。
40.上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
41.附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
42.图1是根据本发明实施例的分享变量的发送方法的主要流程的示意图之一;
43.图2是根据本发明实施例的分享变量拆分的流程示意图;
44.图3是根据本发明实施例的校验接收请求的流程的示意图;
45.图4是根据本发明实施例的校验接收请求以及分配分享变量的流程的示意图;
46.图5是根据本发明实施例的校验接收请求、分配分享变量以及分享变量退回的流程的示意图;
47.图6是根据本发明实施例的分享变量的发送装置的主要模块的示意图之一;
48.图7是根据本发明实施例的分享变量的发送装置的主要模块的示意图之二;
49.图8是本发明实施例可以应用于其中的示例性系统架构图;
50.图9是适于用来实现本发明实施例的接收终端或服务器的计算机系统的结构示意图。
具体实施方式
51.以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
52.为了解决以上问题,本发明实施例提供了一种分享变量的发送方法,该分享变量的发送方法可以应用于高并发的场景,所述高并发场景是指在同一时间点发送接收请求的接收终端超过预设数量时向接收终端发送分享变量的场景,并可以保证在高并发场景下准确且高效地分配分享变量。图1是根据本发明实施例的分享变量的发送方法的主要流程的示意图,如图1所示,所述分享变量的发送方法具体可以包括如下步骤:
53.步骤101:接收分配请求,所述分配请求携带有分享变量的分配总量以及分配数量;
54.在步骤101中,所述分配请求用于将分享变量分配给对应的接收终端,其中所述分
享变量可以为红包、积分、游戏币或优惠券等,本发明实施例并不具体限定所述分享变量的具体形式。所述分配总量可以理解为用于分配的所述分享变量的总量,例如:当所述分享变量为红包时,所述分配总量对应为红包的总金额;当所述分享变量为游戏币时,所述分配总量对应为游戏币的总价值。所述分配数量可以理解为要将所述分享变量拆分或分配的个数,所述分配数量的分享变量的分配量的总和为所述分配总量。以所述分享变量是红包为例,若所述分配数量为10个,则需要拆分出10个红包,并将10个红包进行分配。
55.步骤102:根据所述分配请求,将所述分配总量按照所述分配数量拆分,以得到数量为所述分配数量的分享变量,并将每个所述分享变量依次缓存至redis队列中,参见图2;
56.在步骤102中,在将所述分配总量按照所述分配数量拆分时,可以采用均分方式或随机方式进行拆分,可以根据实际需要自行选择具体的拆分方式。若拆分方式为随机方式,则可以采用随机算法将所述分配总量按照所述分配数量进行随机拆分;若拆分方式为均分方式,则可以采用平均值的算法将所述分配总量按照所述分配数量进行平均拆分。
57.在对所述分享变量进行缓存时,可以将所述分享变量对应的属性信息依次缓存至redis队列中,redis是一个开源(bsd许可)内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理,它支持字符串、哈希表、列表、有序集合以及位图等数据类型。所述属性信息用于表示与所述分享变量的分配属性相关的信息,所述属性信息至少包括:所述分享变量的第一标识信息以及分配量等。其中,所述第一标识信息用于区分不同的所述分享变量,所述第一标识信息具有唯一性,所述第一标识信息可以为名称或编码等。例如:所述第一标识信息可以为唯一编码(id)。每个所述分享变量的分配量可以理解为每个所述分享变量占所述分配总量的数值。以所述分享变量是红包为例,红包的分配总量为100元,红包的分配数量为10个,若采用平均拆分方式对所述分配总量进行拆分后,每个红包的分配量为10元。
58.在本发明实施例中,可以采用lpush命令将每个所述分享变量依次缓存至redis队列中,lpush命令可以理解为推送命令,通过lpush命令可以向redis队列中推送分享变量。由于redis队列具有降低流量高峰、解除耦合以及高可用等特性,能够在高并发情况下高效获取共享变量(例如:红包),并且可以保证获取共享变量的准确性,同时可以避免共享变量加锁导致效率低的问题。
59.步骤103:当所述redis队列存在未分配的分享变量时,每接收到一个接收终端发送的接收请求,依次从所述redis队列中取出一个分享变量发送给所述接收终端。
60.在步骤103中,所述接收终端可以为发送所述分配请求的终端或其他终端。所述接收请求是所述接收终端发送的接收所述分享变量的请求。在对所述redis队列中的分享变量进行分配时,可以按照先入先出或先入后出的顺序从所述redis队列中取出分享变量并发送给对应的接收终端。
61.需要说明的是,以上实施例会出现一个接收终端多次发接收请求来多次获取红包的情形,为了避免以上情形的出现,在上述实施例的基础上,在步骤102之后且在步骤103之前,所述方法还包括:当接收到第一接收终端发送的第一接收请求,所述第一接收请求携带有第一接收终端的第二标识信息,获取哈希表,所述哈希表存储有已成功被分配过分享信息的接收终端的信息;根据所述第一接收终端的第二标识信息以及哈希表,确定所述第一接收请求是否为重复请求;若所述第一接收请求不是重复请求,则执行步骤103;若所述第
一接收请求是重复请求,则向所述第一接收终端发送分配失败的信息,这样可以避免一个接收终端多次分配分享变量的现象。
62.需要说明的是,所述第二标识信息用于区分不同的接收终端,所述第二标识信息具有唯一性,所述第二标识信息可以为手机号、账号或唯一编码等,本发明实施例并不具体限定所述第二标识信息的具体形式。所述哈希表存储有分配成功的分享信息与对应的接收终端的分配关系,可以理解的是,所述哈希表存储有已成功分配过分享信息的接收终端的信息,即通过所述哈希表可以获知已经成功被分配过分享信息的接收终端的信息。
63.若将拆分后的分享变量存储至mysql数据库(mysql数据库是一种关系型数据库管理系统),由于mysql数据库本身并发连接数的限制,在高并发情况下会导致mysql数据库的卡顿甚至宕机。可以理解的是,将分享变量存储至redis队列的处理速度,相比于将拆分后的分享变量存储至mysql数据库的处理速度更加高效。在本发明实施例中,在接收到接收请求之前,已经完成了分享变量的拆分,并将拆分得到的分享变量依次缓冲至redis队列中,每接收到一个接收终端发送的接收请求,依次从redis队列中取出一个分享变量发送给所述接收终端,这样可以保证在高并发的场景下高效且准确地分配分享变量。
64.图3是根据本发明实施例的分享变量的发送方法的主要流程的示意图,该分享变量的发送方法可以应用于高并发的场景,所述高并发场景是指在同一时间点发送接收请求的接收终端超过预设数量时向接收终端发送分享变量的场景,并可以保证在高并发场景下准确且高效地分配分享变量。如图3所示,所述分享变量的发送方法具体可以包括如下步骤:
65.步骤301:接收分配请求,所述分配请求携带有分享变量的分配总量以及分配数量;根据所述分配请求,将所述分配总量按照所述分配数量拆分,以得到数量为所述分配数量的分享变量,并将每个所述分享变量依次缓存至redis队列中,参见图2;
66.在步骤301中,所述分配请求用于将分享变量分配给对应的接收终端,其中所述分享变量可以为红包、积分、游戏币或优惠券等,本发明实施例并不具体限定所述分享变量的具体形式。所述分配总量可以理解为用于分配的所述分享变量的总量,例如:当所述分享变量为红包时,所述分配总量对应为红包的总金额;当所述分享变量为游戏币时,所述分配总量对应为游戏币的总价值。所述分配数量可以理解为要将所述分享变量拆分或分配的个数。以所述分享变量是红包为例,若所述分配数量为10个,则需要拆分出10个红包,并将10个红包进行分配。
67.在将所述分配总量按照所述分配数量拆分时,可以采用均分方式或随机方式进行拆分,可以根据实际需要自行选择具体的拆分方式。若拆分方式为随机方式,则可以采用随机算法将所述分配总量按照所述分配数量进行随机拆分;若拆分方式为均分方式,则可以采用平均值的算法将所述分配总量按照所述分配数量进行平均拆分,以所述分享变量是红包为例,所述分配总量为100元,所述分配数量为10个,每个红包的金额为10元。
68.在对所述分享变量进行缓存时,可以将每个所述分享变量对应的属性信息依次缓存至redis队列中,redis是一个开源(bsd许可)内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理,它支持字符串、哈希表、列表、有序集合以及位图等数据类型。所述属性信息用于表示每个所述分享变量的分配属性,所述属性信息至少包括:每个所述分享变量的第一标识信息以及分配量等。其中,所述第一标识信息用于区分不同的所述
分享变量,所述第一标识信息具有唯一性,所述第一标识信息可以为名称或编码等。例如:所述第一标识信息可以为唯一编码(id)。每个所述分享变量的分配量可以理解为每个所述分享变量占所述分配总量的数值。以所述分享变量是红包为例,红包的分配总量为100元,红包的分配数量为10个,若采用平均拆分方式对所述分配总量进行拆分后,每个红包的分配量为10元。
69.在本发明实施例中,可以采用lpush命令将每个所述分享变量依次缓存至redis队列中,lpush命令可以理解为推送命令,通过lpush命令可以向redis队列中推送分享变量。由于redis队列具有降低流量高峰、解除耦合以及高可用等特性,能够在高并发情况下高效获取共享变量,并且可以保证获取共享变量的准确性,同时可以避免共享变量加锁导致效率低的问题。
70.步骤302:当接收到第一接收终端发送的第一接收请求,获取哈希表;所述第一接收请求携带有第一接收终端的第二标识信息,所述哈希表存储有已成功被分配过分享信息的接收终端的标识信息;
71.步骤303:判断哈希表是否存储有所述第一接收终端的信息;若所述哈希表未存储有所述第一接收终端的信息,则确定所述第一接收请求不是重复请求,进而执行步骤304;若所述哈希表存储有所述第一接收终端的信息,则确定所述第一接收请求是重复请求,进而执行步骤305。
72.步骤304:若所述第一接收请求不是重复请求,则从所述redis队列中取出所述第一分享变量发送给所述第一接收终端;其中,所述第一分享变量是接收到所述第一接收请求时位于所述redis队列取出首位的分享变量。
73.在步骤304中,所述接收终端可以为发送所述分配请求的终端或其他终端。在对所述redis队列中的分享变量进行分配时,可以按照先入先出或先入后出的顺序从所述redis队列中取出分享变量并发送给对应的接收终端。所述取出首位可以理解为接收到第一接收请求时处于取出顺序队首的位置。
74.步骤305:若所述第一接收请求是重复请求,则不再给所述第一接收终端发送分享信息,向所述第一接收终端发送分配失败的信息。
75.以所述分享变量为红包为例,红包的第一标识信息为:红包id,接收终端的第二标识信息为:用户id。所述哈希表用于存储已经成功分配的红包id和用户id的分配关系,其中key是用户id+红包id,value是红包金额。可以理解的是,所述哈希表存储有已经成功被分配过红包的用户id。接收到第一接收终端发送的第一接收请求,第一接收请求携带有第一接收终端的用户id,判断所述哈希表中是否存储有第一接收终端的用户id,若是,则所述第一接收请求为重复请求,进而向第一接收终端发送位于取出首位的第一分享变量;若否,则所述第一接收请求不是重复请求,不再给第一接收终端发送分享变量。
76.在本发明实施例中,在接收到接收请求之前,已经完成了分享变量的拆分,并将拆分得到的分享变量依次缓冲至redis队列中,每接收到一个接收终端发送的接收请求,依次从redis队列中取出一个分享变量发送给所述接收终端,这样可以保证在高并发的场景下高效且准确地分配分享变量,并且可以实现一个接收终端只能获取一个分享信息的目的。
77.图4是根据本发明实施例的分享变量的发送方法的主要流程的示意图,该分享变量的发送方法可以应用于高并发的场景,所述高并发场景是指在同一时间点发送接收请求
的接收终端超过预设数量时向接收终端发送分享变量的场景,并可以保证在高并发场景下准确且高效地分配分享变量。如图4所示,所述分享变量的发送方法具体可以包括如下步骤:
78.步骤401:接收分配请求,所述分配请求携带有分享变量的分配总量以及分配数量;根据所述分配请求,将所述分配总量按照所述分配数量拆分,以得到数量为所述分配数量的分享变量,并将每个所述分享变量依次缓存至redis队列中,参见图2;
79.在步骤401中,所述分配请求用于将分享变量分配给对应的接收终端,其中所述分享变量可以为红包、积分、游戏币或优惠券等,本发明实施例并不具体限定所述分享变量的具体形式。所述分配总量可以理解为用于分配的所述分享变量的总量,例如:当所述分享变量为红包时,所述分配总量对应为红包的总金额;当所述分享变量为游戏币时,所述分配总量对应为游戏币的总价值。所述分配数量可以理解为要将所述分享变量拆分或分配的个数。以所述分享变量是红包为例,若所述分配数量为10个,则需要拆分出10个红包,并将10个红包进行分配。
80.在将所述分配总量按照所述分配数量拆分时,可以采用均分方式或随机方式进行拆分,可以根据实际需要自行选择具体的拆分方式。若拆分方式为随机方式,则可以采用随机算法将所述分配总量按照所述分配数量进行随机拆分;若拆分方式为均分方式,则可以采用平均值的算法将所述分配总量按照所述分配数量进行平均拆分,以所述分享变量是红包为例,所述分配总量为100元,所述分配数量为10个,每个红包的金额为10元。
81.在对所述分享变量进行缓存时,可以将每个所述分享变量对应的属性信息依次缓存至redis队列中,redis是一个开源(bsd许可)内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理,它支持字符串、哈希表、列表、有序集合以及位图等数据类型。所述属性信息用于表示每个所述分享变量的分配属性,所述属性信息至少包括:每个所述分享变量的第一标识信息以及分配量等。其中,所述第一标识信息用于区分不同的所述分享变量,所述第一标识信息具有唯一性,所述第一标识信息可以为名称或编码等。例如:所述第一标识信息可以为唯一编码(id)。每个所述分享变量的分配量可以理解为每个所述分享变量占所述分配总量的数值。以所述分享变量是红包为例,红包的分配总量为100元,红包的分配数量为10个,若采用平均拆分方式对所述分配总量进行拆分后,每个红包的分配量为10元。
82.在本发明实施例中,可以采用lpush命令将每个所述分享变量依次缓存至redis队列中,lpush命令可以理解为推送命令,通过lpush命令可以向redis队列中推送分享变量。由于redis队列具有降低流量高峰、解除耦合以及高可用等特性,能够在高并发情况下高效获取共享变量,并且可以保证获取共享变量的准确性,同时可以避免共享变量加锁导致效率低的问题。
83.步骤402:当所述redis队列中存在未分配的分享变量,且接收到第一接收终端发送的第一接收请求,根据所述第一接收终端的第二标识信息以及哈希表,确定所述第一接收请求是否为重复请求;若所述第一接收请求不是重复请求时,执行步骤403。
84.在步骤402中,可以通过判断哈希表是否存储有所述第一接收终端的信息,来确定所述第一接收请求是否为重复请求;若所述哈希表未存储有所述第一接收终端的信息,则确定所述第一接收请求不是重复请求;若所述哈希表存储有所述第一接收终端的信息,则
确定所述第一接收请求是重复请求,则不再给所述第一接收终端发送分享变量,并向所述第一接收终端发送分配失败的信息。
85.步骤403:判断所述redis队列是否为nil,其中nil表示无值;通过步骤403可以确定所述redis队列中是否存在未分配的分享变量。若所述redis队列为nil,说明所述redis队列中不存在未分配的分享变量,则执行步骤404;若所述redis队列不是nil,说明所述redis队列中存在未分配的分享变量,则执行步骤405。
86.步骤404:确定所述redis队列中不存在未分配的分享变量,结束流程。
87.步骤405:将第一分享变量发送给所述第一接收终端,并将第一分享变量的分配信息记录到所述哈希表中;其中,所述第一分享变量是接收到所述第一接收请求时位于所述redis队列取出首位的分享变量,所述分配信息用于表示将所述第一分享变量发送给所述第一接收终端的信息;
88.在步骤405中,收到第一接收请求之后,可以通过lpop命令从redis队列中取出分享变量。可以理解的是,lpop命令是取出命令,lpop命令用于取出redis队列中的位于取出首位的分享变量。
89.步骤406:判断是否将所述分配信息成功记录到所述redis队列中;若将所述分配信息成功记录到所述redis队列中,则执行步骤407;若未将所述分配信息成功记录到所述redis队列中,则执行步骤408。
90.步骤407:若将所述分配信息成功记录到所述redis队列中,则所述第一分享变量分配成功;
91.步骤408:若未将所述分配信息成功记录到所述redis队列中,则所述第一分享变量分配失败。
92.以所述分享变量为红包为例,收到接收请求之后,依次从redis队列中通过lpop命令取出位于redis队列取出首位的红包,如果返回nil,说明红包已经分配完,否则分配对应金额的红包。由于redis队列具有降低流量高峰、解除耦合以及高可用等特性,能够在高并发情况下高效获取共享变量,并且可以保证获取共享变量的准确性,同时可以避免共享变量加锁导致效率低的问题。然后将红包的分配信息保存到redis队列中;如果保存成功,则本次抢红包请求完成;否则,抢红包失败,并将红包退回redis队列中。进一步地,为了便于查询红包的分配信息,在将分配信息保存到所述哈希表时,可以将分配信息异步保存到数据库,所述数据库可以为mysql。
93.在本发明实施例中,在接收到接收请求之前,已经完成了分享变量的拆分,并将拆分得到的分享变量依次缓冲至redis队列中,每接收到一个接收终端发送的接收请求,依次从redis队列中取出一个分享变量发送给所述接收终端,这样可以保证在高并发的场景下高效且准确地分配分享变量,并且可以实现一个接收终端只能获取一个分享信息的目的。在第一分享信息分配成功后,可以将第一分享信息对应的分配信息记录至redis队列和数据库中,以便于更加高效处理接收请求。
94.图4所示的流程存在分配失败的分享变量不能被重新分配的问题,为了解决该问题,本发明实施例提供了另一种分享变量的发送方法,该分享变量的发送方法可以应用于高并发的场景,所述高并发场景是指在同一时间点发送接收请求的接收终端超过预设数量时向接收终端发送分享变量的场景,并可以保证在高并发场景下准确且高效地分配分享变
量。图5是根据本发明实施例的分享变量的发送方法的主要流程的示意图,如图5所示,所述分享变量的发送方法具体可以包括如下步骤:
95.步骤501:接收分配请求,所述分配请求携带有分享变量的分配总量以及分配数量;根据所述分配请求,将所述分配总量按照所述分配数量拆分,以得到数量为所述分配数量的分享变量,并将所述分享变量依次缓存至redis队列中,参见图2;
96.在步骤501中,所述分配请求用于将分享变量分配给对应的接收终端,其中所述分享变量可以为红包、积分、游戏币或优惠券等,本发明实施例并不具体限定所述分享变量的具体形式。所述分配总量可以理解为用于分配的所述分享变量的总量,例如:当所述分享变量为红包时,所述分配总量对应为红包的总金额;当所述分享变量为游戏币时,所述分配总量对应为游戏币的总价值。所述分配数量可以理解为要将所述分享变量拆分或分配的个数。以所述分享变量是红包为例,若所述分配数量为10个,则需要拆分出10个红包,并将10个红包进行分配。
97.在将所述分配总量按照所述分配数量拆分时,可以采用均分方式或随机方式进行拆分,可以根据实际需要自行选择具体的拆分方式。若拆分方式为随机方式,则可以采用随机算法将所述分配总量按照所述分配数量进行随机拆分;若拆分方式为均分方式,则可以采用平均值的算法将所述分配总量按照所述分配数量进行平均拆分,以所述分享变量是红包为例,所述分配总量为100元,所述分配数量为10个,每个红包的金额为10元。
98.在对所述分享变量进行缓存时,可以将每个所述分享变量对应的属性信息依次缓存至redis队列中,redis是一个开源(bsd许可)内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理,它支持字符串、哈希表、列表、有序集合以及位图等数据类型。所述属性信息用于表示每个所述分享变量的分配属性,所述属性信息至少包括:每个所述分享变量的第一标识信息以及分配量等。其中,所述第一标识信息用于区分不同的所述分享变量,所述第一标识信息具有唯一性,所述第一标识信息可以为名称或编码等。例如:所述第一标识信息可以为唯一编码(id)。每个所述分享变量的分配量可以理解为每个所述分享变量占所述分配总量的数值。以所述分享变量是红包为例,红包的分配总量为100元,红包的分配数量为10个,若采用平均拆分方式对所述分配总量进行拆分后,每个红包的分配量为10元。
99.进一步地,可以采用lpush命令将每个所述分享变量依次缓存至redis队列中,lpush命令可以理解为推送命令,通过lpush命令可以向队列中推送分享变量。由于redis队列具有降低流量高峰、解除耦合以及高可用等特性,能够在高并发情况下高效获取共享变量,并且可以保证获取共享变量的准确性,同时可以避免共享变量加锁导致效率低的问题。
100.步骤502:当所述redis队列中存在未分配的分享变量,且接收到第一接收终端发送的第一接收请求,根据所述第一接收终端的第二标识信息以及哈希表,确定所述第一接收请求是否为重复请求;若所述第一接收请求不是重复请求时,执行步骤503。
101.在步骤502中,可以通过判断哈希表是否存储有所述第一接收终端的信息,来确定所述第一接收请求是否为重复请求;若所述哈希表未存储有所述第一接收终端的信息,则确定所述第一接收请求不是重复请求;若所述哈希表存储有所述第一接收终端的信息,则确定所述第一接收请求是重复请求,则不再给所述第一接收终端发送分享变量,并向所述第一接收终端发送分配失败的信息。
102.步骤503:判断所述redis队列是否为nil,其中nil表示无值;通过步骤503可以确定所述redis队列中是否存在未分配的分享变量。若所述redis队列为nil,说明所述redis队列中不存在未分配的分享变量,则执行步骤504;若所述redis队列不是nil,说明所述redis队列中存在未分配的分享变量,则执行步骤505。
103.步骤504:确定所述redis队列中不存在未分配的分享变量,结束流程。
104.步骤505:将第一分享变量发送给所述第一接收终端,并将第一分享变量的分配信息记录到所述哈希表中,并将所述分配信息异步保存到数据库中;其中,所述第一分享变量是接收到所述第一接收请求时位于所述redis队列取出首位的分享变量,所述分配信息用于表示将所述第一分享变量发送给所述第一接收终端的信息。
105.在步骤505中,可以将所述第一接收终端的第二标识信息以及所述第一分享变量对应的第一标识信息写入哈希表中,其中,key(关键字)是所述第一接收终端的第二标识信息以及所述第一分享变量对应的第一标识信息,value(哈希值)是分享变量的属性信息。例如:以所述分享变量为红包为例,红包的第一标识信息为:红包id,接收终端的第二标识信息为:用户id。将用户id以及红包id写入哈希表中,其中key是用户id+红包id,value是红包金额。
106.需要说明的是,将分配信息异步保存到数据库的目的是更高效的处理所述接收请求。另外,由于redis队列适合高并发查询数据,但是不适合永久存储数据,数据库可以对数据进行永久存储。通过将将分配信息异步保存到数据库,可以方便以后查阅。
107.步骤506:判断是否将所述分配信息成功记录到所述哈希表和数据库中;若将所述分配信息成功记录到所述哈希表和数据库中,则执行步骤507;若未将所述分配信息成功记录到所述哈希表或数据库中,则执行步骤508。
108.步骤507:若将所述分配信息成功记录到所述哈希表和数据库中,则所述第一分享变量分配成功,结束流程。
109.步骤508:若未将所述分配信息成功记录到所述哈希表或数据库中,则删除所述哈希表和所述数据库中已经保存的所述第一分享信息的分配信息,然后执行步骤509。
110.步骤509:将所述第一分享变量重新插入所述redis队列中,并
111.在步骤508中,可以通过rpush命令将分配失败的分享变量重新插入redis队列,rpush命令将分配失败的分享变量重新插入redis队列的取出首位,这样可以保证分配失败的分享变量优先被取出。
112.以所述分享变量为红包为例,如果接收终端由于重复请求导致分配失败,需要将红包退回至redis队列,并将红包继续发送给其他接收终端,可以通过rpush命令将红包重新插入redis队列,rpush命令将分配失败的红包重新插入redis队列的取出首位,这样可以保证分配失败的红包优先被取出。
113.在本发明实施例中,在接收到接收请求之前,已经完成了分享变量的拆分,并将拆分得到的分享变量依次缓冲至redis队列中,每接收到一个接收终端发送的接收请求,依次从redis队列中取出一个分享变量发送给所述接收终端,这样可以保证在高并发的场景下高效且准确地分配分享变量,并且可以实现一个接收终端只能获取一个分享信息的目的。在第一分享信息分配失败后,还可以将分配失败的第一分享信息重新插入所述redis队列中,进而可以将所述第一分享信息发送给其他接收终端。在第一分享信息分配成功后,可以
将第一分享信息对应的分配信息记录至redis队列和数据库中,以便于更加高效处理接收请求。
114.图6是根据本发明实施例的分享变量的发送装置的主要模块的示意图,参见图6,该分享变量的发送装置600具体可以包括:
115.初始化模块601,用于接收分配请求,所述分配请求携带有分享变量的分配总量以及分配数量;根据所述分配请求,将所述分配总量按照所述分配数量拆分,以得到数量为所述分配数量的分享变量,并将所述分享变量依次缓存至redis队列中;
116.分配模块602,用于当所述redis队列存在未分配的分享变量时,每接收到一个接收终端发送的接收请求,依次从所述redis队列中取出一个分享变量并发送给所述接收终端。
117.可选地,所述初始化模块601进一步可以用于:
118.将每个所述分享变量对应的属性信息依次缓存至redis队列中,所述属性信息至少包括:每个所述分享变量的第一标识信息。
119.可选地,所述分享信息的发送装置还包括:
120.校验模块,用于当接收到第一接收终端发送的第一接收请求,获取哈希表;所述第一接收请求携带有第一接收终端的第二标识信息,所述哈希表存储有已成功被分配过分享信息的接收终端的标识信息;根据所述第一接收终端的第二标识信息以及哈希表,确定所述第一接收请求是否为重复请求;若所述第一接收请求不是重复请求,则执行从所述redis队列中取出一个分享变量发送给所述第一接收终端的步骤;若所述第一接收请求是重复请求,则不再给所述第一接收终端发送分享信息,向所述第一接收终端发送分配失败的信息。
121.可选地,所述校验模块进一步还用于:
122.判断哈希表是否存储有所述第一接收终端的信息;若所述哈希表未存储有所述第一接收终端的信息,则确定所述第一接收请求不是重复请求;若所述哈希表存储有所述第一接收终端的信息,则确定所述第一接收请求是重复请求。
123.可选地,所述分配模块602进一步可以用于:
124.当所述redis队列存在未分配的分享变量且第一接收终端发送的第一接收请求不是重复请求时,从所述redis队列中取出第一分享变量并发送给所述第一接收终端;其中,所述第一分享变量是接收到所述第一接收请求时位于所述redis队列取出首位的分享变量;
125.若将分配信息成功记录到哈希表中,则所述第一分享变量分配完成,其中,所述分配信息用于表示所述第一分享变量与所述第一接收终端的分配关系的信息。
126.可选地,所述分配模块602进一步可以用于:
127.在将所述分配信息记录到所述哈希表中时,将所述分配信息异步保存到数据库中。
128.可选地,所述分享信息的发送装置还包括:
129.退回模块,用于若未将所述分配信息成功记录到所述哈希表或所述数据库中,则将所述第一分享变量重新插入所述redis队列中,并删除所述哈希表和所述数据库中已经保存的所述第一分享信息的分配信息。
130.在本发明实施例中,所述分享信息发送装置在接收到接收请求之前已经完成了分
享变量的拆分,并将拆分得到的分享变量依次缓冲至redis队列中,每接收到一个接收终端发送的接收请求,依次从redis队列中取出一个分享变量发送给所述接收终端,这样所述分享信息发送装置可以保证在高并发的场景下高效且准确地分配分享变量。
131.参见图7,所述分享信息的发送装置包括:初始化模块701、分配模块702、校验模块703以及退回模块704。
132.其中,所述初始化模块701用于接收分配请求,所述分配请求携带有分享变量的分配总量以及分配数量;根据所述分配请求,将所述分配总量按照所述分配数量拆分,以得到数量为所述分配数量的分享变量,并将每个所述分享变量依次缓存至redis队列中,然后触发校验模块703。
133.所述校验模块703用于当接收到第一接收终端发送的第一接收请求,获取哈希表;所述第一接收请求携带有第一接收终端的第二标识信息,所述哈希表存储有已成功被分配过分享信息的接收终端的标识信息;并根据所述第一接收终端的第二标识信息以及哈希表,确定所述第一接收请求是否为重复请求;若所述第一接收请求不是重复请求,则触发分配模块702,来执行从所述redis队列中取出一个分享变量发送给所述第一接收终端的步骤;若所述第一接收请求是重复请求,则不再给所述第一接收终端发送分享信息,向所述第一接收终端发送分配失败的信息,结束流程。
134.所述分配模块702用于当所述redis队列存在未分配的分享变量且第一接收终端发送的第一接收请求不是重复请求时,从所述redis队列中取出第一分享变量并发送给所述第一接收终端;其中,所述第一分享变量是接收到所述第一接收请求时位于所述redis队列取出首位的分享变量;若将分配信息成功记录到哈希表中,则所述第一分享变量分配完成,其中,所述分配信息用于表示所述第一分享变量与所述第一接收终端的分配关系的信息。若未将所述分配信息成功记录到所述哈希表或所述数据库中,则触发退回模块704。
135.所述退回模块704用于若未将所述分配信息成功记录到所述哈希表或所述数据库中,则将所述第一分享变量重新插入所述redis队列中,并删除所述哈希表和所述数据库中已经保存的所述第一分享信息的分配信息。
136.以所述分享信息是红包为例,所述红包的分配总量为a元,所述分配数量为b个,每个接收终端最多只能被分配一个红包。首先,通过所述初始化模块701根据所述红包的分配总量以及分配数量,采用随机拆分方式将a元按照b个拆分,以得到b个红包。每个红包包含唯一id,然后将b个红包初始化并高效缓存:redis队列,利用redis队列本身支持高并发且高效的特性,进行红包的分配;接收到接收终端发送的接收请求时,通过校验模块703根据接收终端的id以及哈希表进行校验来确定接收请求是否为重复请求;如果是,则响应重复请求;否则,通过所述分配模块702根据接收请求分配红包,每收到一个接收终端发送的接收请求,就从redis队列中取出一个红包分配给发送接收请求的接收终端。同时,将分配信息记录到哈希表中,并将所述分配信息异步保存至数据库中。如果将分配信息写入哈希表或数据库失败,则触发退回模块704来将红包重新插入redis队列中,并将分配信息从所述哈希表和数据库中删除。
137.图8示出了可以应用本发明实施例的分享信息的发送方法或分享信息的发送装置的示例性系统架构800。
138.如图8所示,系统架构800可以包括接收终端801、802、803,网络804和服务器805。
网络804用以在接收终端801、802、803和服务器805之间提供通信链路的介质。网络804可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
139.用户可以使用接收终端801、802、803通过网络804与服务器805交互,以接收或发送消息等。接收终端801、802、803上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等。
140.接收终端801、802、803可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
141.服务器805可以是提供各种服务的服务器,例如对用户利用接收终端801、802、803所浏览的购物类网站提供支持的后台管理服务器。
142.需要说明的是,本发明实施例所提供的分享信息的发送方法一般由服务器805执行,相应地,分享信息的发送装置一般设置于服务器805中。
143.应该理解,图8中的接收终端、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的接收终端、网络和服务器。
144.下面参考图9,其示出了适于用来实现本发明实施例的接收终端的计算机系统900的结构示意图。图9示出的接收终端仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
145.如图9所示,计算机系统900包括中央处理单元(cpu)901,其可以根据存储在只读存储器(rom)902中的程序或者从存储部分908加载到随机访问存储器(ram)903中的程序而执行各种适当的动作和处理。在ram 903中,还存储有系统900操作所需的各种程序和数据。cpu 901、rom 902以及ram 903通过总线904彼此相连。输入/输出(i/o)接口905也连接至总线904。
146.以下部件连接至i/o接口905:包括键盘、鼠标等的输入部分906;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分907;包括硬盘等的存储部分908;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分909。通信部分909经由诸如因特网的网络执行通信处理。驱动器910也根据需要连接至i/o接口905。可拆卸介质911,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器910上,以便于从其上读出的计算机程序根据需要被安装入存储部分908。
147.特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分909从网络上被下载和安装,和/或从可拆卸介质911被安装。在该计算机程序被中央处理单元(cpu)901执行时,执行本发明的系统中限定的上述功能。
148.需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、
或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、rf等等,或者上述的任意合适的组合。
149.附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
150.描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括初始化模块和分配模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定。
151.作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:接收分配请求,所述分配请求携带有分享变量的分配总量以及分配数量;根据所述分配请求,将所述分配总量按照所述分配数量拆分,以得到数量为所述分配数量的分享变量,并将所述分享变量依次缓存至redis队列中;当所述redis队列存在未分配的分享变量时,每接收到一个接收终端发送的接收请求,依次从所述redis队列中取出一个分享变量并发送给所述接收终端。
152.在本发明实施例中,所述分享信息发送方法在接收到接收请求之前已经完成了分享变量的拆分,并将拆分得到的分享变量依次缓冲至redis队列中,每接收到一个接收终端发送的接收请求,依次从redis队列中取出一个分享变量发送给所述接收终端,这样所述分享信息发送方法可以保证在高并发的场景下高效且准确地分配分享变量。
153.上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1