一种号码分配方法、服务器及系统转让专利

申请号 : CN201611031543.5

文献号 : CN106506663B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘宇

申请人 : 北京科摩仕捷科技有限公司

摘要 :

本发明公开了一种号码分配方法、服务器及系统,分配服务器与缓存服务器通信连接,该方法包括:接收客户端的号码分配请求,号码分配请求包括需求分配的号码数量和请求序列号;向缓存服务器发送需求分配的号码数量,指示缓存服务器将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和;从缓存服务器中的号码信息数据库获取原子游标更新后的值;根据原子游标更新后的值与需求分配的号码数量计算可分配的号码的顺序ID范围;将顺序ID范围和请求序列号发送至缓存服务器,以便缓存服务器根据顺序ID范围,将号码对应的号码分配请求ID批量更新为请求序列号,并向客户端返回分配成功标识。

权利要求 :

1.一种号码分配方法,适于在分配服务器中执行,所述分配服务器与缓存服务器通信连接,所述缓存服务器包括号码信息数据库,所述号码信息数据库中存储有多条号码信息,并设置有原子游标,每条号码信息包括号码、顺序ID、随机号和号码分配请求ID,所述原子游标指向最新被分配的号码所对应的号码信息,所述方法包括:接收客户端的号码分配请求,所述号码分配请求包括需求分配的号码数量和请求序列号;

向缓存服务器发送需求分配的号码数量,指示缓存服务器将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和;

从缓存服务器中的号码信息数据库获取原子游标更新后的值;

根据所述原子游标更新后的值与需求分配的号码数量计算可分配的号码的顺序ID范围;

将所述顺序ID范围和请求序列号发送至缓存服务器,以便缓存服务器根据所述顺序ID范围,将所述号码对应的号码分配请求ID批量更新为所述请求序列号,并向客户端返回分配成功标识。

2.如权利要求1所述的方法,还包括:

接收客户端的号码查询请求,所述号码查询请求包括已分配的号码对应的号码分配请求ID;

根据所述已分配的号码对应的号码分配请求ID,从缓存服务器中的号码信息数据库获取其对应的号码并返回给客户端。

3.如权利要求1所述的方法,所述缓存服务器中号码信息数据库中的原子游标的值初始化为0。

4.如权利要求1所述的方法,还包括:

缓存服务器预先初始化号码信息,并存储至号码信息数据库中。

5.如权利要求4所述的方法,所述缓存服务器预先初始化号码信息包括:顺序生成多个号码和与该号码对应的随机号;

按照随机号从大到小的顺序排列所述号码对应的号码信息;

将排列好的号码信息的顺序位次设置为其对应的顺序ID;

初始化号码分配请求ID为NULL。

6.如权利要求1-5中任一项所述的方法,所述缓存服务器中号码信息数据库存储的号码信息还包括自增主键、号码创建时间和号码修改时间。

7.一种分配服务器,与缓存服务器及多个客户端通信连接,所述缓存服务器包括号码信息数据库,所述号码信息数据库中存储有多条号码信息,并设置有原子游标,每条号码信息包括号码、顺序ID、随机号和号码分配请求ID,所述原子游标指向最新被分配的号码所对应的号码信息,所述分配服务器包括:接收模块,适于接收客户端的号码分配请求,所述号码分配请求包括需求分配的号码数量和请求序列号;

第一发送模块,适于向缓存服务器发送需求分配的号码数量,指示缓存服务器将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和;

获取模块,适于从缓存服务器中的号码信息数据库获取原子游标更新后的值;

计算模块,适于根据所述原子游标更新后的值与需求分配的号码数量计算可分配的号码的顺序ID范围;

第二发送模块,适于将所述顺序ID范围和请求序列号发送至缓存服务器,以便缓存服务器根据所述顺序ID范围,将所述号码对应的号码分配请求ID批量更新为所述请求序列号,并向客户端返回分配成功标识。

8.如权利要求7所述的分配服务器,其中,所述接收模块还适于:接收客户端的号码查询请求,所述号码查询请求包括已分配的号码对应的号码分配请求ID;

所述获取模块还适于:

根据所述已分配的号码对应的号码分配请求ID,从缓存服务器中的号码信息数据库获取其对应的号码并返回给客户端。

9.如权利要求7所述的分配服务器,与所述分配服务器通信连接的缓存服务器中,所述号码信息数据库中的原子游标的值初始化为0。

10.如权利要求7所述的分配服务器,与所述分配服务器通信连接的缓存服务器还包括:第二更新模块,适于根据分配服务器发送的需求分配的号码数量,将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和;

第三更新模块,适于根据分配服务器发送的顺序ID范围和请求序列号,将所述顺序ID范围内号码对应的号码分配请求ID批量更新为所述请求序列号。

11.如权利要求7所述的分配服务器,与所述分配服务器通信连接的缓存服务器还包括初始化模块,适于预先初始化号码信息,并存储至号码信息数据库中。

12.如权利要求11所述的分配服务器,与所述分配服务器通信连接的缓存服务器中的初始化模块进一步适于:顺序生成多个号码和与该号码对应的随机号;

按照随机号从大到小的顺序排列所述号码对应的号码信息;

根据顺序ID从小到大的顺序排列所述顺序ID对应的号码信息;

初始化号码分配请求ID为NULL。

13.如权利要求7-12中任一项所述的分配服务器,与所述分配服务器通信连接的缓存服务器中,所述号码信息数据库存储的号码信息还包括自增主键、号码创建时间和号码修改时间。

14.一种号码分配系统,包括如权利要求7-13中任一项所述的分配服务器和缓存服务器。

说明书 :

一种号码分配方法、服务器及系统

技术领域

[0001] 本发明涉及互联网技术领域,特别涉及一种号码分配方法、服务器及系统。

背景技术

[0002] 随着互联网技术的不断发展,越来越多的用户参与到互联网中的各种互动活动中,其中抽奖类的互动活动尤其受到用户的关注和欢迎,从而互联网夺宝平台随之兴起。由于此类活动通常具有大量的用户参与数量,因此如何准确并快速地为用户分配参与号码成为了平台开发的重点考虑因素之一。
[0003] 目前,B/S结构下开发的夺宝平台所采用的参与号码分配方案,从缓存中获取可用参与号码时,均是以单个号码作为最小单位进行操作的,而在用作缓存服务器的Redis中,lpop/rpop/blpop/brpop操作的时间复杂度为O(1),则获取N个参与号码所需要的时间复杂度将变成O(N),一旦待获取号码个数变大时,进行分配所需要的时间也会增加,而且获取N个参与号码时需要逐一获取,所需访问缓存次数也会同时增多。
[0004] 特别是当上述N值较大的参与号码分配请求出现并发时,号码分配失败的概率也随之增加,即用户获取参与号码失败的可能性增加,进而导致用户无法获取参与号码,带来较差的互动体验。产生这一现象的原因在于,现有方案中,由于获取参与号码所要求的准确性高,参与号码要求唯一并且能且仅能被一个用户所获取,因此,从缓存队列中获取参与号码一般都会采用串行加锁机制,来保证并发时同一个参与号码不会被分配给多个用户的号码分配请求,并且每次请求中所需的N个参与号码全部获取成功后才算请求成功。正因如此,当获取参与号码请求并发量达到一个级别时,会增加获取失败的可能性。举例来说,现有三个用户请求,分别是用户请求A、用户请求B和用户请求C,其中:
[0005] A请求2个参与号码,从缓存获取号码的操作请求为A1、A2;
[0006] B请求3个参与号码,从缓存获取号码的操作请求为B1、B2、B3;
[0007] C请求1个参与号码,从缓存获取号码的操作请求为C。
[0008] 每次从缓存获取1个号码操作所需时间为1,且请求超时的时间阈值为2。以A1、B1同时进入队列,在A1处理完,A2为开始时,C1进入队列为入队顺序,则从缓存获取参与号码的操作队列为:A1、B1、C1、A2、B2……。随后,开始依次请求分配号码。
[0009] 对A1而言,等待时间为0,完成时间为1,相应地,C1进入队列开始等待,A2进入队列开始等待,B1等待时间为1;
[0010] 对B1而言,等待时间为1,完成时间为1,相应地,C1等待时间为1,B2进入队列开始等待,A2等待时间为1;
[0011] 对C1而言,C1等待时间为1,完成时间为1,用户请求C请求成功,A2等待时间为2,B2等待时间为1;
[0012] 对A2而言,A2等待时间为2,超时,用户请求A请求时间。
[0013] 由上述场景可看出,即便用户请求A增加超时重试机制,但由于串行队列的约束,队列中等待的元素个数越多,失败的可能性就会越高。因此,需要一种新的号码分配方案来优化上述分配过程。

发明内容

[0014] 为此,本发明提供一种号码分配方案,以力图解决或者至少缓解上面存在的问题。
[0015] 根据本发明的一个方面,提供一种号码分配方法,适于在分配服务器中执行,分配服务器与缓存服务器通信连接,缓存服务器包括号码信息数据库,号码信息数据库中存储有多条号码信息,并设置有原子游标,每条号码信息包括号码、顺序ID、随机号和号码分配请求ID,原子游标指向最新被分配的号码所对应的号码信息,该方法包括如下步骤:接收客户端的号码分配请求,号码分配请求包括需求分配的号码数量和请求序列号;向缓存服务器发送需求分配的号码数量,指示缓存服务器将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和;从缓存服务器中的号码信息数据库获取原子游标更新后的值;根据原子游标更新后的值与需求分配的号码数量计算可分配的号码的顺序ID范围;将顺序ID范围和请求序列号发送至缓存服务器,以便缓存服务器根据顺序ID范围,将号码对应的号码分配请求ID批量更新为请求序列号,并向客户端返回分配成功标识。
[0016] 可选地,在根据本发明的号码分配方法中,还包括:接收客户端的号码查询请求,号码查询请求包括已分配的号码对应的号码分配请求ID;根据所述已分配的号码对应的号码分配请求ID,从缓存服务器中的号码信息数据库获取其对应的号码并返回给客户端。
[0017] 可选地,在根据本发明的号码分配方法中,所述缓存服务器中号码信息数据库中的原子游标的值初始化为0。
[0018] 可选地,在根据本发明的号码分配方法中,还包括:缓存服务器预先初始化号码信息,并存储至号码信息数据库中。
[0019] 可选地,在根据本发明的号码分配方法中,所述缓存服务器预先初始化号码信息包括:顺序生成多个号码和与该号码对应的随机号;按照随机号从大到小的顺序排列所述号码对应的号码信息;将排列好的号码信息的顺序位次设置为其对应的顺序ID;初始化号码分配请求ID为NULL。
[0020] 可选地,在根据本发明的号码分配方法中,所述缓存服务器中号码信息数据库存储的号码信息还包括自增主键、号码创建时间和号码修改时间。
[0021] 根据本发明的又一个方面,提供一种分配服务器,与缓存服务器及多个客户端通信连接,所述缓存服务器包括号码信息数据库,所述号码信息数据库中存储有多条号码信息,并设置有原子游标,每条号码信息包括号码、顺序ID、随机号和号码分配请求ID,原子游标指向最新被分配的号码所对应的号码信息,分配服务器包括接收模块、第一发送模块、获取模块、计算模块和第二发送模块。其中,接收模块适于接收客户端的号码分配请求,号码分配请求包括需求分配的号码数量和请求序列号;第一发送模块适于向缓存服务器发送需求分配的号码数量,指示缓存服务器将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和;获取模块适于从缓存服务器中的号码信息数据库获取原子游标更新后的值;计算模块适于根据原子游标更新后的值与需求分配的号码数量计算可分配的号码的顺序ID范围;第二发送模块适于将顺序ID范围和请求序列号发送至缓存服务器,以便缓存服务器根据顺序ID范围,将号码对应的号码分配请求ID批量更新为请求序列号,并向客户端返回分配成功标识。
[0022] 可选地,在根据本发明的分配服务器中,接收模块还适于接收客户端的号码查询请求,号码查询请求包括已分配的号码对应的号码分配请求ID;获取模块还适于根据已分配的号码对应的号码分配请求ID,从号码信息数据库中获取其对应的号码并返回给客户端。
[0023] 可选地,在根据本发明的与分配服务器通信连接的缓存服务器中,号码信息数据库中的原子游标的值初始化为0。
[0024] 可选地,在根据本发明的与分配服务器通信连接的缓存服务器中,还包括:第二更新模块,适于根据分配服务器发送的需求分配的号码数量,将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和;第三更新模块,适于根据分配服务器发送的顺序ID范围和请求序列号,将顺序ID范围内号码对应的号码分配请求ID批量更新为请求序列号。
[0025] 可选地,在根据本发明的与分配服务器通信连接的缓存服务器中,还包括初始化模块,适于预先初始化号码信息,并存储至号码信息数据库中。
[0026] 可选地,在根据本发明的与分配服务器通信连接的缓存服务器中,初始化模块进一步适于:顺序生成多个号码和与该号码对应的随机号;按照随机号从大到小的顺序排列所述号码对应的号码信息;将排列好的号码信息的顺序位次设置为其对应的顺序ID;初始化号码分配请求ID为NULL。
[0027] 可选地,在根据本发明的与分配服务器通信连接的缓存服务器中,号码信息数据库存储的号码信息还包括自增主键、号码创建时间和号码修改时间。
[0028] 根据本发明的又一个方面,还提供一种号码分配系统,包括根据本发明的分配服务器和缓存服务器。
[0029] 根据本发明的号码分配的技术方案,在接收到客户端的号码分配请求后,将缓存服务器中的号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和,根据原子游标更新后的值与需求分配的号码数量计算可分配的号码的顺序ID范围,向客户端返回分配成功标识。在上述技术方案中,预先初始化号码信息时,为全部号码设置唯一顺序ID,以使号码对应的号码信息形成一个按序排列的号码信息队列,并利用原子游标在操作上的原子性及低时间复杂度的特点,实现了分段获取号码,从而降低了因某一个号码分配请求失败而导致整体请求失败的可能性,减少了服务器之间的消息传递数量,降低了服务器的负载,提升了服务器的吞吐量。

附图说明

[0030] 为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本公开的上述以及其它目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
[0031] 图1示出了根据本发明的一个实施例的号码分配系统100的示意图;
[0032] 图2示出了根据本发明一个实施例的号码分配方法200的流程图;
[0033] 图3示出了根据本发明一个实施例的分配服务器300的示意图;以及
[0034] 图4示出了根据本发明一个实施例的缓存服务器400的示意图。

具体实施方式

[0035] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0036] 图1示出了根据本发明一个实施例的号码分配系统100的示意图。如图1所示,号码分配系统100包括分配服务器300和缓存服务器400,分配服务器300和缓存服务器400通信连接,缓存服务器400包括号码信息数据库(图中未示出),该号码信息数据中存储有多条号码信息,并设置有原子游标,每条号码信息包括号码、顺序ID、随机号和号码分配请求ID,原子游标指向最新被分配的号码所对应的号码信息。在图1中,与分配服务器300通信连接的还有计算设备500和移动终端600,计算设备500一般为PC机,移动终端600一般为智能手机或平板电脑,但均不限于此,数量上也未作任何限制。在本实施例中,分配服务器300通过通信网络分别与缓存服务器400、计算设备500和移动终端600交换数据信息,以下将以计算设备500为例进行说明。具体来说,计算设备500作为客户端,向分配服务器300发出号码分配请求,分配服务器300接收到客户端发出的号码分配请求后,向缓存服务器400发送需求分配的号码数量,缓存服务器400将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和。分配服务器300根据原子游标更新后的值与需求分配的号码数量,计算可分配的号码的顺序ID范围,将顺序ID范围和请求序列号发送至缓存服务器400,并向计算设备500返回分配成功标识。缓存服务器400根据顺序ID范围,将号码对应的号码分配请求ID批量更新为请求序列号。通过本号码分配系统100,一方面分配服务器可以一次性从缓存服务器获取多个号码的顺序ID,减少了服务器之间的消息传递数量,降低了服务器负载,另一方面无需在一个号码分配请求中多次请求缓存服务器,减少了号码分配请求失败的可能性,提升了系统的稳定性和可靠性。
[0037] 图2示出了根据本发明一个实施例的号码分配方法200的流程图。号码分配方法200适于在分配服务器(例如图1所示的分配服务器300)中执行。当然,在号码分配方法200执行之前,缓存服务器(例如图1所示的缓存服务器400)中需要预先初始化号码信息,并存储至号码信息数据库中。其中,每条号码信息包括号码、顺序ID、随机号和号码分配请求ID,则预先初始化号码信息包括:顺序生成多个号码和与该号码对应的随机号,按照随机号从大到小的顺序排列所述号码对应的号码信息,将排列好的号码信息的顺序位次设置为其对应的顺序ID,根据顺序ID从小到大的顺序排列所述顺序ID对应的号码信息,初始化号码分配请求ID为NULL。
[0038] 上述号码信息还包括自增主键、号码创建时间和号码修改时间。在本实施例中,缓存服务器可选用Redis,Redis是一个开源的、内存存储的数据结构服务器,可用作Key-Value数据库、高速缓存和消息队列代理,从而构建用于存储号码信息的号码信息数据库。为便于描述,将号码信息中的自增主键、号码创建时间和号码修改时间进行了省略。以预先初始化7条号码信息为例,首先顺序生成7个号码和与该号码对应的随机号,通过列表形式进行展示,如表1所示,其中符号“-”表示尚未初始化。
[0039]号码 顺序ID 随机号 号码分配请求ID
10002732 - 999619 -
10018399 - 999879 -
10019872 - 999977 -
10000495 - 999402 -
10019690 - 999023 -
10010123 - 999997 -
10010205 - 999011 -
[0040] 表1
[0041] 随后,按照随机号从大到小的顺序排列号码对应的号码信息。随机号按从大到小的顺序排列依次为:999997、999977、999879、999619、999402、999023和999011,则按照上述顺序排列号码对应的号码信息,结果如表2所示。
[0042]号码 顺序ID 随机号 号码分配请求ID
10010123 - 999997 -
10019872 - 999977 -
10018399 - 999879 -
10002732 - 999619 -
10000495 - 999402 -
10019690 - 999023 -
10010205 - 999011 -
[0043] 表2
[0044] 接下来,将排列好的号码信息的顺序位次设置为其对应的顺序ID,则号码10010123、10019872、10018399、10002732、10000495、10019690和10010205对应的顺序ID分别为1、2、3、4、5、6和7,结果如表3所示。
[0045]号码 顺序ID 随机号 号码分配请求ID
10010123 1 999997 -
10019872 2 999977 -
10018399 3 999879 -
10002732 4 999619 -
10000495 5 999402 -
10019690 6 999023 -
10010205 7 999011 -
[0046] 表3
[0047] 最后,初始化号码分配请求ID为NULL,结果如表4所示。
[0048]号码 顺序ID 随机号 号码分配请求ID
10010123 1 999997 NULL
10019872 2 999977 NULL
10018399 3 999879 NULL
10002732 4 999619 NULL
10000495 5 999402 NULL
10019690 6 999023 NULL
10010205 7 999011 NULL
[0049] 表4
[0050] 在实际处理过程中,号码信息还可以包括号码有效状态,如果号码有效状态为1,则表示号码有效,如果号码有效状态为0,则表示号码无效。一般而言,初始化成功后号码信息均是有效的,但有时会存在某些特殊情况需要删除该号码信息,则将其号码有效状态置为0,不参与后续的号码分配。
[0051] 号码信息初始化完成后,将其存储至号码信息数据库中,并将原子游标的值初始化为0。上述预先初始化号码信息并存储至号码信息数据库的关键代码如下所示:
[0052]
[0053]
[0054] 如图2所示,方法200始于步骤S20。在步骤S210中,接收客户端的号码分配请求,号码分配请求包括需求分配的号码数量和请求序列号。在本实施中,接收作为客户端的计算设备500发送的号码分配请求,其中需求分配的号码数量为5,请求序列号为0000293。
[0055] 随后,进入步骤S220,根据步骤S210中接收到的号码分配请求,向缓存服务器发送需求分配的号码数量,指示缓存服务器将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和。本实施例中,号码信息数据库中原子游标的当前值为0,表明分配服务器尚未接收到客户端的号码分配请求,没有开始进行号码分配,需求分配的号码数量为5,则原子游标的值更新为5。上述原子游标的更新操作实际上是对其进行递增处理,可利用Redis中的incBy命令执行。由于incBy的原子特性,可以确保并发时每个线程将顺序获取不同的号码区间,而且具有低时间复杂度O(1),因此当多个客户端同时进行号码分配请求时,系统也可以快速响应。关键代码如下所示:
[0056]
[0057] 接下来,在步骤S230中,从缓存服务器中的号码信息数据库获取原子游标更新后的值。在本实施例中,从缓存服务器中的号码信息数据库获取原子游标更新后的值为5,进而执行步骤S240,根据原子游标更新后的值与需求分配的号码数量计算可分配的号码的顺序ID范围。顺序ID范围的起始值计算公式为:
[0058] 顺序ID范围的起始值=原子游标更新后的值-需求分配的号码数量+1
[0059] 其中,原子游标更新后的值为5,需求分配的号码数量为5,则顺序ID范围的起始值为5-5+1=1,从而顺序ID范围为1~5。关键代码如下所示:
[0060] Integer startCursor=(cursor.intValue()-cfCodeCursor.getBuyTimes())+1;
[0061] cfCodeCursor.setStartCursor(startCursor);
[0062] Integer endCursor=cursor.intValue();
[0063] cfCodeCursor.setEndCursor(endCursor);
[0064] 最后,进入步骤S250,将步骤S240中计算得出的顺序ID范围和请求序列号发送至缓存服务器,以便缓存服务器根据顺序ID范围,将号码对应的号码分配请求ID批量更新为请求序列号,并向客户端返回分配成功标识。在本实施例中,顺序ID范围为1~5,请求序列号为0000293,则将顺序ID为1、2、3、4和5的号码对应的号码分配请求ID批量更新为0000293,结果如表5所示。
[0065]号码 顺序ID 随机号 号码分配请求ID
10010123 1 999997 0000293
10019872 2 999977 0000293
10018399 3 999879 0000293
10002732 4 999619 0000293
10000495 5 999402 0000293
10019690 6 999023 NULL
10010205 7 999011 NULL
[0066] 表5
[0067] 此时,原子游标的值为5,指向最新被分配的号码所对应的号码信息,即指向顺序ID为5的号码所对应的号码信息。关键代码如下所示:
[0068]
[0069] 当客户端接收到分配成功标识后,即可进入查询状态来具体查询所分配的号码。若客户端向分配服务器发送号码查询请求,则分配服务器接收客户端的号码查询请求,号码查询请求包括已分配的号码对应的号码分配请求ID,根据已分配的号码对应的号码分配请求ID,从缓存服务器中的号码信息数据库获取其对应的号码并返回给客户端。在本实施例中,已分配的号码对应的号码分配请求ID为0000293,当计算设备500向分配服务器300发送号码查询请求后,在缓存服务器400的号码信息数据库中查询号码分配请求ID为0000293对应的号码信息,获取已分配的号码为10010123、10019872、10018399、10002732和
10000495,最后将上述5个号码返回给计算设备500。以上号码查询请求和号码分配请求是拆分长两个操作的,从而降低了每个必要请求响应时间,只有当用户需要查询号码信息时,客户端才会发出号码查询请求进行查询。
[0070] 图3示出了本发明一个实施例的分配服务器300的示意图。如图3所示,该装置包括:接收模块310、第一发送模块320、获取模块330、计算模块340和第二发送模块350。
[0071] 接收模块.310适于接收客户端的号码分配请求,号码分配请求包括需求分配的号码数量和请求序列号。在本实施中,所接收到的是作为客户端的计算设备500发送的号码分配请求,其中需求分配的号码数量为5,请求序列号为0000293。
[0072] 第一发送模块320适于向缓存服务器发送需求分配的号码数量,指示缓存服务器将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和。本实施例中,号码信息数据库中原子游标的当前值为0,表明分配服务器尚未接收到客户端的号码分配请求,没有开始进行号码分配,需求分配的号码数量为5,则原子游标的值更新为5。
[0073] 获取模块330适于从缓存服务器中的号码信息数据库获取原子游标更新后的值。在本实施例中,从缓存服务器中的号码信息数据库获取原子游标更新后的值为5。
[0074] 计算模块340适于根据原子游标更新后的值与需求分配的号码数量计算可分配的号码的顺序ID范围。在本实施例中,原子游标更新后的值为5,需求分配的号码数量为5,则顺序ID范围的起始值为5-5+1=1,从而顺序ID范围为1~5。
[0075] 第二发送模块350适于将顺序ID范围和请求序列号发送至缓存服务器,以便缓存服务器根据顺序ID范围,将号码对应的号码分配请求ID批量更新为请求序列号,并向客户端返回分配成功标识。在本实施例中,顺序ID范围为1~5,请求序列号为0000293,则将表4中顺序ID为1、2、3、4和5的号码对应的号码分配请求ID批量更新为0000293,结果如表5所示。此时,原子游标的值为5,指向最新被分配的号码所对应的号码信息,即指向顺序ID为5的号码所对应的号码信息。
[0076] 当客户端接收到分配成功标识后,即可进入查询状态来具体查询所分配的号码。进而,接收模块310还适于接收客户端的号码查询请求,号码查询请求包括已分配的号码对应的号码分配请求ID。获取模块330还适于根据已分配的号码对应的号码分配请求ID,从缓存服务器中的号码信息数据库获取其对应的号码并返回给客户端。在本实施例中,已分配的号码对应的号码分配请求ID为0000293,当计算设备500向分配服务器300发送号码查询请求后,在缓存服务器400的号码信息数据库中查询号码分配请求ID为0000293对应的号码信息,获取已分配的号码为10010123、10019872、10018399、10002732和10000495,最后将上述5个号码返回给计算设备500。
[0077] 图4示出了根据本发明一个实施例的缓存服务器400的示意图。如图4所示,该装置包括:号码信息数据库410、第二更新模块420和第三更新模块430和初始化模块440。
[0078] 号码信息数据库410存储有多条号码信息,并设置有原子游标,每条号码信息包括号码、顺序ID、随机号和号码分配请求ID,原子游标指向最新被分配的号码所对应的号码信息。其中,原子游标的值初始化为0,号码信息还包括自增主键、号码创建时间和号码修改时间。
[0079] 第二更新模块420适于根据分配服务器发送的需求分配的号码数量,将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和。
[0080] 第三更新模块430适于根据分配服务器发送的顺序ID范围和请求序列号,将顺序ID范围内号码对应的号码分配请求ID批量更新为请求序列号。
[0081] 初始化模块440适于预先初始化号码信息,并存储至号码信息数据库410中。初始化模块440进一步适于顺序生成多个号码和与该号码对应的随机号;按照随机号从大到小的顺序排列号码对应的号码信息;将排列好的号码信息的顺序位次设置为其对应的顺序ID;初始化号码分配请求ID为NULL。在本实施例中,预先初始化完成后的号码信息数据库410中存储的号码信息,可参见表4。
[0082] 关于号码分配的具体步骤以及实施例,在基于图2的描述中已经详细公开,此处不再赘述。
[0083] 现有的号码分配方案中,当随着客户端的号码分配请求数量不断增加,分配服务器进行号码分配所需的时间也会同时增加。特别是当参与号码分配请求出现并发时,号码分配失败的概率也随之增加,进而导致客户端无法获取参与号码,系统性能大幅下降。根据本发明的号码分配的技术方案,在接收到客户端的号码分配请求后,将缓存服务器中的号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和,根据原子游标更新后的值与需求分配的号码数量计算可分配的号码的顺序ID范围,向客户端返回分配成功标识。在上述技术方案中,预先初始化号码信息时,为全部号码设置唯一顺序ID,以使号码对应的号码信息形成一个按序排列的号码信息队列,并利用原子游标在操作上的原子性及低时间复杂度的特点,实现了分段获取号码,从而降低了因某一个号码分配请求失败而导致整体请求失败的可能性,减少了服务器之间的消息传递数量,降低了服务器的负载,提升了服务器的吞吐量。
[0084] B10.如B7-9中任一项所述的分配服务器,与所述分配服务器通信连接的缓存服务器还包括:
[0085] 第二更新模块,适于根据分配服务器发送的需求分配的号码数量,将号码信息数据库中原子游标的值更新为其当前值与需求分配的号码数量之和;
[0086] 第三更新模块,适于根据分配服务器发送的顺序ID范围和请求序列号,将所述顺序ID范围内号码对应的号码分配请求ID批量更新为所述请求序列号。
[0087] B11.如B7-10中任一项所述的分配服务器,与所述分配服务器通信连接的缓存服务器还包括初始化模块,适于预先初始化号码信息,并存储至号码信息数据库中。
[0088] B12.如B11所述的分配服务器,与所述分配服务器通信连接的缓存服务器中的初始化模块进一步适于:
[0089] 顺序生成多个号码和与该号码对应的随机号;
[0090] 按照随机号从大到小的顺序排列所述号码对应的号码信息;
[0091] 根据顺序ID从小到大的顺序排列所述顺序ID对应的号码信息;
[0092] 初始化号码分配请求ID为NULL。
[0093] B13.如B7-12中任一项所述的分配服务器,与所述分配服务器通信连接的缓存服务器中,所述号码信息数据库存储的号码信息还包括自增主键、号码创建时间和号码修改时间。
[0094] 在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0095] 类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
[0096] 本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
[0097] 本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0098] 此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0099] 此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
[0100] 如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
[0101] 尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的,而非限制性的,本发明的范围由所附权利要求书限定。