高并发下的数据分布式写入方法、装置、终端及存储介质转让专利

申请号 : CN201811629694.X

文献号 : CN109739857B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李润恒

申请人 : 深圳市网心科技有限公司

摘要 :

本发明公开了一种高并发下的数据分布式写入方法,应用于终端中,终端中存储有正向索引表和反向索引表,所述方法包括:接收到键‑值对的写入指令时,计算键应位于的反向索引表中对应值的第一虚拟值对应的第一虚拟键中的反向位置索引;当反向索引表的版本号没发生变化时,将键写入具有反向位置索引的子值对应的数组中;计算值应位于的正向索引表中对应的第二虚拟值中的正向位置索引;当正向索引表的版本号没发生变化时,将值写入具有正向位置索引的子键对应的数组中。本发明还公开了一种高并发下的数据分布式写入装置、终端及存储介质。本发明能够解决多对多型的数据的分布式写入的技术问题,提高了在高并发情况下访问数据的效率。

权利要求 :

1.一种高并发下的数据分布式写入方法,应用于终端中,其特征在于,所述终端中预先存储有正向索引表和反向索引表,所述方法包括:接收到键-值对的写入指令时,记录所述反向索引表的版本号和所述正向索引表的版本号;

获取所述反向索引表中对应所述键-值对中的值的第一虚拟值,并计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引;

当所述反向索引表版本号未发生变化时,将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中;

获取所述正向索引表中对应所述键-值对中的键的第二虚拟键,并计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引;

当所述正向索引表版本号未发生变化时,将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中。

2.如权利要求1所述的方法,其特征在于,所述计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引包括:计算所述键的第一散列值;

根据预设第一位置序号与第一散列值之间的对应关系确定所述键应位于的所述第一虚拟键中的反向位置索引,所述反向位置索引中包括所述第一位置序号。

3.如权利要求1所述的方法,其特征在于,所述计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引包括:计算所述值的第二散列值;

根据预设第二位置序号与第二散列值之间的对应关系确定所述值应位于的所述第二虚拟值中的正向位置索引,所述正向位置索引中包括所述第二位置序号。

4.如权利要求1所述的方法,其特征在于,在将所述键-值对写入所述反向索引表成功,但将所述键-值对写入所述正向索引表时失败时,所述方法还包括:回滚所述反向索引表,以保持所述正向索引表和所述反向索引表中的数据一致性;

所述回滚所述反向索引表包括:在所述反向索引表的当前版本号与成功写入时的版本号相同时,删除写入所述第一虚拟键下的所有子值及对应的键。

5.如权利要求1至4中任意一项所述的方法,其特征在于,在所述获取所述反向索引表中对应所述键-值对中的值的第一虚拟值之前,所述方法还包括:判断所述反向索引表中是否存在对应所述键-值对中的值的第一虚拟值;

当确定不存在对应所述键-值对中的值的第一虚拟值时,创建所述第一虚拟值,所述第一虚拟值中包括所述值及预设值拆分为子值的第一个数。

6.如权利要求5所述的方法,其特征在于,在所述计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引之后,所述方法还包括:判断所述第一虚拟键中是否存在具有所述反向位置索引的子值;

当确定不存在具有所述反向位置索引的子值时,创建具有所述反向位置索引的子值,同时将所述第一个数加1。

7.如权利要求6所述的方法,其特征在于,在所述将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中之前,所述方法还包括:判断所述第一虚拟键中具有所述反向位置索引的子值对应的数组中是否存在所述键;

当确定存在所述键时,不进行任何操作并返回写入成功的结果。

8.如权利要求1至4中任意一项所述的方法,其特征在于,在所述获取所述正向索引表中对应所述键-值对中的键的第二虚拟键之前,所述方法还包括:判断所述正向索引表中是否存在对应所述键-值对中的键的第二虚拟键;

当确定不存在对应所述键-值对中的键的第二虚拟键时,创建所述第二虚拟键,所述第二虚拟键中包括所述键及预设键拆分为子键的第二个数。

9.如权利要求8所述的方法,其特征在于,在所述计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引之后,所述方法还包括:判断所述第二虚拟值中是否存在具有所述正向位置索引的子键;

当确定不存在具有所述正向位置索引的子键时,创建具有所述正向位置索引的子键,同时将所述第二个数加1。

10.如权利要求9所述的方法,其特征在于,在所述将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中之前,所述方法还包括:判断所述第二虚拟值中具有所述正向位置索引的子键对应的数组中是否存在所述值;

当确定存在所述值时,不进行任何操作并返回写入成功的结果。

11.一种高并发下的数据分布式写入装置,运行于终端中,其特征在于,所述终端中预先存储有正向索引表和反向索引表,所述装置包括:接收模块,用于接收到键-值对的写入指令时,记录所述反向索引表的版本号和所述正向索引表的版本号;

第一获取模块,用于获取所述反向索引表中对应所述键-值对中的值的第一虚拟值,并计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引;

第一写入模块,用于当所述反向索引表版本号未发生变化时,将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中;

第二获取模块,用于获取所述正向索引表中对应所述键-值对中的键的第二虚拟键,并计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引;

第二写入模块,用于当所述正向索引表版本号未发生变化时,将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中。

12.一种终端,其特征在于,所述终端包括存储器和处理器,所述存储器上存储有可在所述处理器上运行的高并发下的数据分布式写入程序,所述高并发下的数据分布式写入程序被所述处理器执行时实现如权利要求1至10中任一项所述的高并发下的数据分布式写入方法。

13.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有高并发下的数据分布式写入程序,所述高并发下的数据分布式写入程序可被一个或者多个处理器执行,以实现如权利要求1至10中任一项所述的高并发下的数据分布式写入方法。

说明书 :

高并发下的数据分布式写入方法、装置、终端及存储介质

技术领域

[0001] 本发明涉及数据库技术领域,尤其涉及一种高并发下的数据分布式写入方法、装置、终端及存储介质。

背景技术

[0002] 随着互联网技术的深入发展和分布式计算技术的兴起,数据库管理系统需要处理的数据量越来越庞大,基于单机运行的传统关系型数据库虽然能够保证索引的一致性,但数据库读写性能过低,且大量占用数据库集群的运算能力。为此,人们进行了多方面的技术尝试。多种分布式数据库系统已经被开发出来,包括BigTable、HBase、MongoDB、Cassandra和Redis等。这些分布式数据库系统可以包括数百或数千个节点,具有处理从兆字节(terabyte,TB)到拍字节(petabyte,PB)数据的能力。
[0003] 然而,现有的分布式数据库都是基于单个数据表的操作处理方式,无法有效的打破传统关系型数据库在高并发下的数据写入效率上的瓶颈。
[0004] 因此,有必要提出一种能够解决多对多型的数据的分布式写入的技术问题,以便提高在高并发情况下访问数据的效率。

发明内容

[0005] 本发明的主要目的在于提供一种高并发下的数据分布式写入方法、装置、终端及存储介质,旨在解决多对多型的数据的分布式写入的技术问题,以便提高在高并发情况下访问数据的效率。
[0006] 为实现上述目的,本发明第一方面提供一种高并发下的数据分布式写入方法,应用于终端中,所述终端中预先存储有正向索引表和反向索引表,所述方法包括:
[0007] 接收到键-值对的写入指令时,记录所述反向索引表的版本号和所述正向索引表的版本号;
[0008] 获取所述反向索引表中对应所述键-值对中的值的第一虚拟值,并计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引;
[0009] 当所述反向索引表版本号未发生变化时,将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中;
[0010] 获取所述正向索引表中对应所述键-值对中的键的第二虚拟键,并计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引;
[0011] 当所述正向索引表版本号未发生变化时,将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中。
[0012] 优选的,所述计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引包括:
[0013] 计算所述键的第一散列值;
[0014] 根据预设第一位置序号与第一散列值之间的对应关系确定所述键应位于的所述第一虚拟键中的反向位置索引,所述反向位置索引中包括所述第一位置序号。
[0015] 优选的,所述计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引包括:
[0016] 计算所述值的第二散列值;
[0017] 根据预设第二位置序号与第二散列值之间的对应关系确定所述值应位于的所述第二虚拟值中的正向位置索引,所述正向位置索引中包括所述第二位置序号。
[0018] 优选的,在将所述键-值对写入所述反向索引表成功,但将所述键-值对写入所述正向索引表时失败时,所述方法还包括:
[0019] 回滚所述反向索引表,以保持所述正向索引表和所述反向索引表中的数据一致性;
[0020] 所述回滚所述反向索引表包括:在所述反向索引表的当前版本号与成功写入时的版本号相同时,删除写入所述第一虚拟键下的所有子值及对应的键。
[0021] 优选的,在所述获取所述反向索引表中对应所述键-值对中的值的第一虚拟值之前,所述方法还包括:
[0022] 判断所述反向索引表中是否存在对应所述键-值对中的值的第一虚拟值;
[0023] 当确定不存在对应所述键-值对中的值的第一虚拟值时,创建所述第一虚拟值,所述第一虚拟值中包括所述值及预设值拆分为子值的第一个数。
[0024] 优选的,在所述计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引之后,所述方法还包括:
[0025] 判断所述第一虚拟键中是否存在具有所述反向位置索引的子值;
[0026] 当确定不存在具有所述反向位置索引的子值时,创建具有所述反向位置索引的子值,同时将所述第一个数加1。
[0027] 优选的,在所述将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中之前,所述方法还包括:
[0028] 判断所述第一虚拟键中具有所述反向位置索引的子值对应的数组中是否存在所述键;
[0029] 当确定存在所述键时,不进行任何操作并返回写入成功的结果。
[0030] 优选的,在所述获取所述正向索引表中对应所述键-值对中的键的第二虚拟键之前,所述方法还包括:
[0031] 判断所述正向索引表中是否存在对应所述键-值对中的键的第二虚拟键;
[0032] 当确定不存在对应所述键-值对中的键的第二虚拟键时,创建所述第二虚拟键,所述第二虚拟键中包括所述键及预设键拆分为子键的第二个数。
[0033] 优选的,在所述计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引之后,所述方法还包括:
[0034] 判断所述第二虚拟值中是否存在具有所述正向位置索引的子键;
[0035] 当确定不存在具有所述正向位置索引的子键时,创建具有所述正向位置索引的子键,同时将所述第二个数加1。
[0036] 优选的,在所述将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中之前,所述方法还包括:
[0037] 判断所述第二虚拟值中具有所述正向位置索引的子键对应的数组中是否存在所述值;
[0038] 当确定存在所述值时,不进行任何操作并返回写入成功的结果。
[0039] 为实现上述目的,本发明第二方面提供一种高并发下的数据分布式写入装置,运行于终端中,所述终端中预先存储有正向索引表和反向索引表,所述装置包括:
[0040] 接收模块,用于接收到键-值对的写入指令时,记录所述反向索引表的版本号和所述正向索引表的版本号;
[0041] 第一获取模块,用于获取所述反向索引表中对应所述键-值对中的值的第一虚拟值,并计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引;
[0042] 第一写入模块,用于当所述反向索引表版本号未发生变化时,将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中;
[0043] 第二获取模块,用于获取所述正向索引表中对应所述键-值对中的键的第二虚拟键,并计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引;
[0044] 第二写入模块,用于当所述正向索引表版本号未发生变化时,将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中。
[0045] 为实现上述目的,本发明第三方面提供一种终端,所述终端包括存储器和处理器,所述存储器上存储有可在所述处理器上运行的高并发下的数据分布式写入程序,所述高并发下的数据分布式写入程序被所述处理器执行时实现所述的高并发下的数据分布式写入方法。
[0046] 为实现上述目的,本发明第四方面提供一种计算机可读存储介质,所述计算机可读存储介质上存储有高并发下的数据分布式写入程序,所述高并发下的数据分布式写入程序可被一个或者多个处理器执行,以实现所述高并发下的数据分布式写入方法。
[0047] 本发明实施例所述的高并发下的数据分布式写入方法、装置、终端及存储介质,接收到键-值对的写入指令时,计算键应位于的反向索引表中对应值的第一虚拟值对应的第一虚拟键中的反向位置索引;当反向索引表的版本号没发生变化时,将键写入具有反向位置索引的子值对应的数组中;计算值应位于的正向索引表中对应所述键-值对中的键的第二虚拟键对应的第二虚拟值中的正向位置索引;当正向索引表的版本号没发生变化时,将值写入具有正向位置索引的子键对应的数组中。通过将待写入的键-值对先写入反向索引表中,再写入正向索引表中,能有效的确保高并发下的,多对多型的数据的写入效率,且能确保正向索引和反向索引的一致性。

附图说明

[0048] 图1为本发明第一实施例的高并发下的数据分布式写入方法的流程示意图;
[0049] 图2为本发明实施例提供的反向索引表的示意图;
[0050] 图3为本发明实施例提供的正向索引表的示意图;
[0051] 图4为本发明第二实施例的高并发下的数据分布式写入装置的结构示意图;
[0052] 图5为本发明第四实施例揭露的终端的内部结构示意图。
[0053] 本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

[0054] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0055] 本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
[0056] 需要说明的是,在本发明中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。
[0057] 为便于更清楚的了解本发明的技术方案,现简单的介绍下下列术语:
[0058] 数据库中的键(key)又称为关键字,键(key)用作元素的索引,本实施例中用序列号(Serial Number,SN)表示键(key);
[0059] 值(value)则表示所存储和读取的数据,本实施例中用全局唯一标识符(Globally Unique Identifier,GUID)表示SN对应的值(value)。
[0060] 数据库中的一行数据为一条对应关系,SN->GUID为一条正向索引,GUID->SN为一条反向索引。在多对多型的数据库中,相同的SN可以对应多个不同的GUID,不同的SN可以对应多个相同的GUID。
[0061] 实施例一
[0062] 图1为本发明第一实施例的高并发下的数据分布式写入方法的流程示意图。
[0063] 所述高并发下的数据分布式写入方法可以应用于终端中,也可以应用于数据库服务器中。对于需要创建分布式数据库索引的终端,可以直接在终端上集成本发明的方法所提供的创建分布式数据库索引的功能。或者以软件开发工具包(Software Development Kit,SDK)的形式提供创建分布式数据库索引的功能的接口,终端通过所提供的接口实现高并发下的数据分布式写入。
[0064] 如图1所示,所述高并发下的数据分布式写入方法具体包括以下步骤,根据不同的需求,该流程图中步骤的顺序可以改变,某些步骤可以省略。
[0065] S11:接收到键-值对的写入指令时,记录所述反向索引表的版本号和所述正向索引表的版本号。
[0066] 本实施例中,终端中预先存储有正向索引表和反向索引表,预先存储的正向索引表和反向索引表中的数据均为虚拟键值对的形式。正向索引表便于进行与正向索引相关的操作,反向索引表便于进行与反向索引相关的操作。
[0067] 本实施例中,所要写入的键-值对以多对多的关系型数据为例进行说明,在多对多的关系型数据中,相同的键可以对应多个不同的值,相同的值可以对应多个不同的键。
[0068] 用户可以通过上层逻辑调用接口或者人机交互接口或者其他方式,请求写入至少一个键-值对。终端接收到键-值对的写入指令时,先记录接收写入指令时所述反向索引表的版本号和所述正向索引表的版本号。
[0069] 版本号是一个自增量,在每次写入成功后增加。由于在高并发的情况下,同一时间可能存在多人请求写入键-值对,因而,为了解决高并发下的数据竞争的问题,需要读取整个反向索引表和正向索引表中的数据以免存在重复写入数据的情况,故在写入键-值对之前,先检查反向索引表和正向索引表的版本号是否发生改变。如果反向索引表及/或正向索引表的版本号发生了改变,那么说明有其他的请求已经完成了写入,此时将不会进行索引表的更新,而是进行重试。
[0070] S12:获取所述反向索引表中对应所述键-值对中的值的第一虚拟值,并计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引。
[0071] 本实施例中,由于对正向索引的数据的正确性需求更高,因而首先将键-值对写入反向索引表中,再将键-值对写入正向索引表中,如此能够确保在写入正向索引表时,一旦出现错误,对数据的反馈会更加灵敏。
[0072] 所述反向索引表中的数据为第一虚拟键-值对的形式,所述第一虚拟值由值及所述值拆分为子值的第一个数构成,所述第一虚拟键由所述子值及每个所述子值对应的键构成,所述子值的个数与所述键的个数对应。即,关系型数据库中的值,此时在反向索引表中被虚拟化为值和对应所述值的子值的第一个数(值和值的子值的第一个数合起来可以记作第一info);关系型数据库中的值的键,此时在反向索引表中被虚拟化为所述子值(子值可以记作第一shard)及对应所述子值的键,且所述子值的键采用数组的形式进行存储,反向索引表如图2所示。
[0073] 优选的,所述计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引包括:
[0074] 1)计算所述键的第一散列值;
[0075] 本实施例中,所述键的第一散列值可以采用散列函数计算得到。关于散列函数为现有技术,本发明在此不做详细赘述。
[0076] 2)根据预设第一位置序号与第一散列值之间的对应关系确定所述键应位于的所述第一虚拟键中的反向位置索引,所述反向位置索引中包括所述第一位置序号。
[0077] 预先建立了反向位置索引中的第一位置序号与第一散列值之间的对应关系,计算得到待写入的键的第一散列值之后,可以匹配出与第一散列值对应的第一位置序号,再根据第一位置序号匹配出对应的反向位置索引。子值具有反向位置索引,子值对应的键存储在与反向位置索引对应的位置序号的列表中,列表中的键以数组的形式进行存储。
[0078] 优选的,在所述获取所述反向索引表中对应所述键-值对中的值的第一虚拟值之前,所述方法还包括:
[0079] 判断所述反向索引表中是否存在对应所述键-值对中的值的第一虚拟值;
[0080] 当确定不存在对应所述键-值对中的值的第一虚拟值时,创建所述第一虚拟值,所述第一虚拟值中包括所述值及预设值拆分为子值的第一个数。
[0081] 本实施例中,待写入键-值对时,先判断是否存在对应所述键-值对中的值的第一虚拟值。若不存在,则创建一个对应所述键-值对中的值的第一虚拟值。创建的第一虚拟值包括值与预先配置的值拆分为子值的第一个数。
[0082] 优选的,在所述计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引之后,所述方法还包括:
[0083] 判断所述第一虚拟键中是否存在具有所述反向位置索引的子值;
[0084] 当确定不存在具有所述反向位置索引的子值时,创建具有所述反向位置索引的子值,同时将所述第一个数加1。
[0085] 本实施例中,在将所述键写入具有所述反向位置索引的子值对应的数组中之前,先判断第一虚拟键中是否存在具有反向位置索引的子值。若不存在,则根据所述反向位置索引创建一个子值。
[0086] S13:当所述反向索引表版本号未发生变化时,将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中。
[0087] 本实施例中,在将所述键写入第一虚拟键中具有所述反向位置索引的子值对应的数组之前,再次获取反向索引表的版本号,将本次获取的版本号与之前接收到写入指令时获取的版本号进行对比,如果本次获取的版本号与之前接收到写入指令时获取的版本号相同,则表明版本号未发生变化,则可以插入新的键。如果本次获取的版本号与之前接收到写入指令时获取的版本号不相同,则表明版本号发生了变化,即已被其它并发请求操作并进行了更新,则不进行操作并重试。
[0088] 本实施例中,若写入反向索引表失败且进行重试的次数超过预设第一次数阈值时,返回错误并退出。
[0089] 优选的,在所述将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中之前,所述方法还包括:
[0090] 判断所述第一虚拟键中具有所述反向位置索引的子值对应的数组中是否存在所述键;
[0091] 当确定存在所述键时,不进行任何操作并返回写入成功的结果。
[0092] 为了对反向索引表中的数据进行去重校验,在写入所述键之前,需先判断第一虚拟键中具有所述反向位置索引的子值的数组中是否存在所述键,当发现存在所述键时,认为要写入的键-值对已经在反向索引表中了,即写入成功。
[0093] S14:获取所述正向索引表中对应所述键-值对中的键的第二虚拟键,并计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引。
[0094] 本实施例中,在将键-值对写入反向索引表之后,还需将键-值对写入正向索引表中。
[0095] 所述正向索引表中的数据为第二虚拟键-值对的形式,所述第二虚拟值由键及所述键拆分为子键的第二个数构成,所述第一虚拟值由所述子键及每个所述子键对应的值构成,所述子键的个数与所述值的个数对应。即,关系型数据库中的键,此时在正向索引表中被虚拟化为键和对应所述键的子键的第二个数(键和键的子键的第二个数合起来可以记作第二info);关系型数据库中的键的值,此时在正向索引表中被虚拟化为所述子键(子键可以记作第二shard)及对应所述子键的值,且所述子键的值采用数组的形式进行存储,正向索引表如图3所示。
[0096] 优选的,所述计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引包括:
[0097] 1)计算所述值的第二散列值;
[0098] 本实施例中,所述值的第二散列值可以采用散列函数计算得到。关于散列函数为现有技术,本发明在此不做详细赘述。
[0099] 2)根据预设第二位置序号与第二散列值之间的对应关系确定所述值应位于的所述第二虚拟值中的正向位置索引,所述正向位置索引中包括所述第二位置序号。
[0100] 预先建立了正向位置索引中的第二位置序号与第二散列值之间的对应关系,计算得到待写入的值的第二散列值之后,可以匹配出与第二散列值对应的第二位置序号,再根据第二位置序号匹配出对应的正向位置索引。子键具有正向位置索引,子键对应的值存储在与正向位置索引对应的位置序号的列表中,列表中的值以数组的形式进行存储。
[0101] 优选的,在所述获取所述正向索引表中对应所述键-值对中的键的第二虚拟键之前,所述方法还包括:
[0102] 判断所述正向索引表中是否存在对应所述键-值对中的键的第二虚拟键;
[0103] 当确定不存在对应所述键-值对中的键的第二虚拟键时,创建所述第二虚拟键,所述第二虚拟键中包括所述键及预设键被拆分为子键的第二个数。
[0104] 本实施例中,待写入键-值对时,先判断是否存在对应所述键-值对中的键的第二虚拟键。若不存在,则创建一个对应所述键的第一虚拟键。创建的第二虚拟键包括键与预先配置的键拆分为子键的第二个数。
[0105] 优选的,在所述计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引之后,所述方法还包括:
[0106] 判断所述第二虚拟值中是否存在具有所述正向位置索引的子键;
[0107] 当确定不存在具有所述正向位置索引的子键时,创建具有所述正向位置索引的子键,同时将所述第二个数加1。
[0108] 本实施例中,在将所述值写入具有所述正向位置索引的子键对应的数组中之前,先判断第二虚拟值中是否存在具有正向位置索引的子键。若不存在,则根据所述正向位置索引创建一个子键。
[0109] S15:当所述正向索引表版本号未发生变化时,将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中。
[0110] 本实施例中,在将所述值写入第二虚拟值中具有所述正向位置索引的子键对应的数组之前,再次获取正向索引表的版本号,将本次获取的版本号与之前接收到写入指令时获取的版本号进行对比,如果本次获取的版本号与之前接收到写入指令时获取的版本号相同,则表明版本号未发生变化,则可以插入新的值。如果本次获取的版本号与之前接收到写入指令时获取的版本号不相同,则表明版本号发生了变化,即已被其它并发请求操作并进行了更新,则不进行操作并重试。
[0111] 本实施例中,若写入正向索引表失败且进行重试的次数超过预设第二次数阈值时,返回错误并进行回滚操作。
[0112] 优选的,在所述将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中之前,所述方法还包括:
[0113] 判断所述第二虚拟值中具有所述正向位置索引的子键对应的数组中是否存在所述值;
[0114] 当确定存在所述值时,不进行任何操作并返回写入成功的结果。
[0115] 为了对正向索引表中的数据进行去重校验,在写入所述值之前,需先判断第二虚拟值中具有所述正向位置索引的子键的数组中是否存在所述值,当发现存在所述值时,认为要写入的键-值对已经在正向索引表中了,即写入成功。
[0116] 优选的,在将所述键-值对写入所述反向索引表成功,但写入所述正向索引表时失败时,所述方法还包括:
[0117] 回滚所述反向索引表,以保持所述正向索引表和所述反向索引表中的数据一致性。
[0118] 所述回滚所述反向索引表包括:在所述反向索引表的当前版本号与成功写入时的版本号相同时,删除写入所述第一虚拟键下的所有子值及对应的键。
[0119] 本实施例中,为了保证正向索引表和反向索引表的一致性,在将待写入的数据写入反向索引表中成功,写入所述正向索引表时失败,需要对写入反向索引表中的键-值对进行删除操作。判断所述反向索引表的当前版本号与成功写入时的版本号不相同时,不进行操作并进行重试。若干次重试失败后,认为回滚失败。如果之前写入的子值及对应子值的键不存在,认为回滚已经成功。在索引超载的情况下可能会导致回滚失败,此时数据库的一致性已经被破坏,已经不能保证服务的可靠性,需向上层逻辑告警并要求一段时间后重试。
[0120] 本发明实施例所述的高并发下的数据分布式写入方法,接收到键-值对的写入指令时,计算键应位于的反向索引表中对应值的第一虚拟值对应的第一虚拟键中的反向位置索引;当反向索引表的版本号没发生变化时,将键写入具有反向位置索引的子值对应的数组中;计算值应位于的正向索引表中对应所述键-值对中的键的第二虚拟键对应的第二虚拟值中的正向位置索引;当正向索引表的版本号没发生变化时,将值写入具有正向位置索引的子键对应的数组中。通过将待写入的键-值对先写入反向索引表中,再写入正向索引表中,能有效的确保高并发下的,多对多型的数据的写入效率,且能确保正向索引和反向索引的一致性。
[0121] 上述图1详细介绍了本发明的高并发下的数据分布式写入方法,下面结合第4~5图,分别对实现所述高并发下的数据分布式写入方法的软件系统的功能模块以及硬件装置架构进行介绍。
[0122] 应该了解,所述实施例仅为说明之用,在专利申请范围上并不受此结构的限制。
[0123] 实施例二
[0124] 参阅图4所示,为本发明一实施例揭露的高并发下的数据分布式写入装置的功能模块示意图。
[0125] 在一些实施例中,所述高并发下的数据分布式写入装置40运行于终端中。所述高并发下的数据分布式写入装置40可以包括多个由程序代码段所组成的功能模块。所述高并发下的数据分布式写入装置40中的各个程序段的程序代码可以存储于终端的存储器中,并由所述至少一个处理器所执行,以执行(详见图1描述)在高并发下,对数据进行分布式写入。
[0126] 本实施例中,所述高并发下的数据分布式写入装置40根据其所执行的功能,可以被划分为多个功能模块。所述功能模块可以包括:接收模块401、第一获取模块402、第一判断模块403、第一创建模块404、第一写入模块405、第二获取模块406、第二判断模块407、第二创建模块408、第二写入模块409及回滚模块410。本发明所称的模块是指一种能够被至少一个处理器所执行并且能够完成固定功能的一系列计算机程序段,其存储在存储器中。在本实施例中,关于各模块的功能将在后续的实施例中详述。
[0127] 接收模块401,用于接收到键-值对的写入指令时,记录所述反向索引表的版本号和所述正向索引表的版本号。
[0128] 本实施例中,终端中预先存储有正向索引表和反向索引表,预先存储的正向索引表和反向索引表中的数据均为虚拟键值对的形式。正向索引表便于进行与正向索引相关的操作,反向索引表便于进行与反向索引相关的操作。
[0129] 本实施例中,所要写入的键-值对以多对多的关系型数据为例进行说明,在多对多的关系型数据中,相同的键可以对应多个不同的值,相同的值可以对应多个不同的键。
[0130] 用户可以通过上层逻辑调用接口或者人机交互接口或者其他方式,请求写入至少一个键-值对。终端接收到键-值对的写入指令时,先记录接收写入指令时所述反向索引表的版本号和所述正向索引表的版本号。
[0131] 版本号是一个自增量,在每次写入成功后增加。由于在高并发的情况下,同一时间可能存在多人请求写入键-值对,因而,为了解决高并发下的数据竞争的问题,需要读取整个反向索引表和正向索引表中的数据以免存在重复写入数据的情况,故在写入键-值对之前,先检查反向索引表和正向索引表的版本号是否发生改变。如果反向索引表及/或正向索引表的版本号发生了改变,那么说明有其他的请求已经完成了写入,此时将不会进行索引表的更新,而是进行重试。
[0132] 第一获取模块402,用于获取所述反向索引表中对应所述键-值对中的值的第一虚拟值,并计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引。
[0133] 本实施例中,由于对正向索引的数据的正确性需求更高,因而首先将键-值对写入反向索引表中,再将键-值对写入正向索引表中,如此能够确保在写入正向索引表时,一旦出现错误,对数据的反馈会更加灵敏。
[0134] 所述反向索引表中的数据为第一虚拟键-值对的形式,所述第一虚拟值由值及所述值拆分为子值的第一个数构成,所述第一虚拟键由所述子值及每个所述子值对应的键构成,所述子值的个数与所述键的个数对应。即,关系型数据库中的值,此时在反向索引表中被虚拟化为值和对应所述值的子值的第一个数(值和值的子值的第一个数合起来可以记作第一info);关系型数据库中的值的键,此时在反向索引表中被虚拟化为所述子值(子值可以记作第一shard)及对应所述子值的键,且所述子值的键采用数组的形式进行存储,反向索引表如图2所示。
[0135] 优选的,所述第一获取模块402计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引包括:
[0136] 1)计算所述键的第一散列值;
[0137] 本实施例中,所述键的第一散列值可以采用散列函数计算得到。关于散列函数为现有技术,本发明在此不做详细赘述。
[0138] 2)根据预设第一位置序号与第一散列值之间的对应关系确定所述键应位于的所述第一虚拟键中的反向位置索引,所述反向位置索引中包括所述第一位置序号。
[0139] 预先建立了反向位置索引中的第一位置序号与第一散列值之间的对应关系,计算得到待写入的键的第一散列值之后,可以匹配出与第一散列值对应的第一位置序号,再根据第一位置序号匹配出对应的反向位置索引。子值具有反向位置索引,子值对应的键存储在与反向位置索引对应的位置序号的列表中,列表中的键以数组的形式进行存储。
[0140] 第一判断模块403,用于在所述第一获取模块402获取所述反向索引表中对应所述键-值对中的值的第一虚拟值之前,判断所述反向索引表中是否存在对应所述键-值对中的值的第一虚拟值;
[0141] 第一创建模块404,用于当所述第一判断模块403确定不存在对应所述键-值对中的值的第一虚拟值时,创建所述第一虚拟值,所述第一虚拟值中包括所述值及预设值拆分为子值的第一个数。
[0142] 本实施例中,待写入键-值对时,先判断是否存在对应所述键-值对中的值的第一虚拟值。若不存在,则创建一个对应所述键-值对中的值的第一虚拟值。创建的第一虚拟值包括值与预先配置的值拆分为子值的第一个数。
[0143] 所述第一判断模块403,还用于在所述第一获取模块402所述计算所述键-值对中的键应位于的所述第一虚拟值对应的第一虚拟键中的反向位置索引之后判断所述第一虚拟键中是否存在具有所述反向位置索引的子值;
[0144] 所述第一创建模块404,还用于当所述第一判断模块403确定不存在具有所述反向位置索引的子值时,创建具有所述反向位置索引的子值,同时将所述第一个数加1。
[0145] 本实施例中,在将所述键写入具有所述反向位置索引的子值对应的数组中之前,先判断第一虚拟键中是否存在具有反向位置索引的子值。若不存在,则根据所述反向位置索引创建一个子值。
[0146] 第一写入模块405,用于当所述反向索引表版本号未发生变化时,将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中。
[0147] 本实施例中,在将所述键写入第一虚拟键中具有所述反向位置索引的子值对应的数组之前,再次获取反向索引表的版本号,将本次获取的版本号与之前接收到写入指令时获取的版本号进行对比,如果本次获取的版本号与之前接收到写入指令时获取的版本号相同,则表明版本号未发生变化,则可以插入新的键。如果本次获取的版本号与之前接收到写入指令时获取的版本号不相同,则表明版本号发生了变化,即已被其它并发请求操作并进行了更新,则不进行操作并重试。
[0148] 本实施例中,若写入反向索引表失败且进行重试的次数超过预设第一次数阈值时,返回错误并退出。
[0149] 优选的,第一判断模块403,还用在所述第一写入模块405将所述键写入所述第一虚拟键中具有所述反向位置索引的子值对应的数组中之前,判断所述第一虚拟键中具有所述反向位置索引的子值对应的数组中是否存在所述键;当确定存在所述键时,不进行任何操作并返回写入成功的结果。
[0150] 为了对反向索引表中的数据进行去重校验,在写入所述键之前,需先判断第一虚拟键中具有所述反向位置索引的子值的数组中是否存在所述键,当发现存在所述键时,认为要写入的键-值对已经在反向索引表中了,即写入成功。
[0151] 第二获取模块406,用于获取所述正向索引表中对应所述键-值对中的键的第二虚拟键,并计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引。
[0152] 本实施例中,在将键-值对写入反向索引表之后,还需将键-值对写入正向索引表中。
[0153] 所述正向索引表中的数据为第二虚拟键-值对的形式,所述第二虚拟值由键及所述键拆分为子键的第二个数构成,所述第一虚拟值由所述子键及每个所述子键对应的值构成,所述子键的个数与所述值的个数对应。即,关系型数据库中的键,此时在正向索引表中被虚拟化为键和对应所述键的子键的第二个数(键和键的子键的第二个数合起来可以记作第二info);关系型数据库中的键的值,此时在正向索引表中被虚拟化为所述子键(子键可以记作第二shard)及对应所述子键的值,且所述子键的值采用数组的形式进行存储,正向索引表如图3所示。
[0154] 优选的,所述第二获取模块406计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引包括:
[0155] 1)计算所述值的第二散列值;
[0156] 本实施例中,所述值的第二散列值可以采用散列函数计算得到。关于散列函数为现有技术,本发明在此不做详细赘述。
[0157] 2)根据预设第二位置序号与第二散列值之间的对应关系确定所述值应位于的所述第二虚拟值中的正向位置索引,所述正向位置索引中包括所述第二位置序号。
[0158] 预先建立了正向位置索引中的第二位置序号与第二散列值之间的对应关系,计算得到待写入的值的第二散列值之后,可以匹配出与第二散列值对应的第二位置序号,再根据第二位置序号匹配出对应的正向位置索引。子键具有正向位置索引,子键对应的值存储在与正向位置索引对应的位置序号的列表中,列表中的值以数组的形式进行存储。
[0159] 第二判断模块407,用于在所述第二获取模块406获取所述正向索引表中对应所述键-值对中的键的第二虚拟键之前,判断所述正向索引表中是否存在对应所述键-值对中的键的第二虚拟键;
[0160] 第二创建模块408,用于当所述第二判断模块407确定不存在对应所述键-值对中的键的第二虚拟键时,创建所述第二虚拟键,所述第二虚拟键中包括所述键及预设键被拆分为子键的第二个数。
[0161] 本实施例中,待写入键-值对时,先判断是否存在对应所述键-值对中的键的第二虚拟键。若不存在,则创建一个对应所述键的第一虚拟键。创建的第二虚拟键包括键与预先配置的键拆分为子键的第二个数。
[0162] 第二判断模块407,还用于在所述第二获取模块406计算所述键-值对中的值应位于的所述第二虚拟键对应的第二虚拟值中的正向位置索引之后,判断所述第二虚拟值中是否存在具有所述正向位置索引的子键;
[0163] 第二创建模块408,还用于当所述第二判断模块407确定不存在具有所述正向位置索引的子键时,创建具有所述正向位置索引的子键,同时将所述第二个数加1。
[0164] 本实施例中,在将所述值写入具有所述正向位置索引的子键对应的数组中之前,先判断第二虚拟值中是否存在具有正向位置索引的子键。若不存在,则根据所述正向位置索引创建一个子键。
[0165] 第二写入模块409,用于当所述正向索引表版本号未发生变化时,将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中。
[0166] 本实施例中,在将所述值写入第二虚拟值中具有所述正向位置索引的子键对应的数组之前,再次获取正向索引表的版本号,将本次获取的版本号与之前接收到写入指令时获取的版本号进行对比,如果本次获取的版本号与之前接收到写入指令时获取的版本号相同,则表明版本号未发生变化,则可以插入新的值。如果本次获取的版本号与之前接收到写入指令时获取的版本号不相同,则表明版本号发生了变化,即已被其它并发请求操作并进行了更新,则不进行操作并重试。
[0167] 本实施例中,若写入正向索引表失败且进行重试的次数超过预设第二次数阈值时,返回错误并进行回滚操作。
[0168] 所述第二判断模块407,还用于在所述第二写入模块409将所述值写入所述第二虚拟值中具有所述正向位置索引的子键对应的数组中之前,判断所述第二虚拟值中具有所述正向位置索引的子键对应的数组中是否存在所述值;当确定存在所述值时,不进行任何操作并返回写入成功的结果。
[0169] 为了对正向索引表中的数据进行去重校验,在写入所述值之前,需先判断第二虚拟值中具有所述正向位置索引的子键的数组中是否存在所述值,当发现存在所述值时,认为要写入的键-值对已经在正向索引表中了,即写入成功。
[0170] 优选的,所述装置还包括:
[0171] 回滚模块410,用于在所述第一写入模块405将所述键-值对写入所述反向索引表成功,但所述第二写入模块409将所述键-值对写入所述正向索引表时失败时,回滚所述反向索引表,以保持所述正向索引表和所述反向索引表中的数据一致性。
[0172] 所述回滚所述反向索引表包括:在所述反向索引表的当前版本号与成功写入时的版本号相同时,删除写入所述第一虚拟键下的所有子值及对应的键。
[0173] 本实施例中,为了保证正向索引表和反向索引表的一致性,在将待写入的数据写入反向索引表中成功,写入所述正向索引表时失败,需要对写入反向索引表中的键-值对进行删除操作。判断所述反向索引表的当前版本号与成功写入时的版本号不相同时,不进行操作并进行重试。若干次重试失败后,认为回滚失败。如果之前写入的子值及对应子值的键不存在,认为回滚已经成功。在索引超载的情况下可能会导致回滚失败,此时数据库的一致性已经被破坏,已经不能保证服务的可靠性,需向上层逻辑告警并要求一段时间后重试。
[0174] 本发明实施例所述的高并发下的数据分布式写入装置,接收到键-值对的写入指令时,计算键应位于的反向索引表中对应值的第一虚拟值对应的第一虚拟键中的反向位置索引;当反向索引表的版本号没发生变化时,将键写入具有反向位置索引的子值对应的数组中;计算值应位于的正向索引表中对应所述键-值对中的键的第二虚拟键对应的第二虚拟值中的正向位置索引;当正向索引表的版本号没发生变化时,将值写入具有正向位置索引的子键对应的数组中。通过将待写入的键-值对先写入反向索引表中,再写入正向索引表中,能有效的确保高并发下的,多对多型的数据的写入效率,且能确保正向索引和反向索引的一致性。
[0175] 实施例三
[0176] 图5为本发明一实施例揭露的终端的内部结构示意图。
[0177] 在本实施例中,终端5可以是固定终端,也可以是移动终端。
[0178] 所述终端5可以包括存储器51、处理器52和总线53。
[0179] 其中,存储器51至少包括一种类型的可读存储介质,所述可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、磁性存储器、磁盘、光盘等。存储器51在一些实施例中可以是所述终端5的内部存储单元,例如所述终端5的硬盘。存储器51在另一些实施例中也可以是所述终端5的外部存储设备,例如所述终端5上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。进一步地,存储器51还可以既包括所述终端5的内部存储单元也包括外部存储设备。存储器51不仅可以用于存储安装于所述终端5的应用软件及各类数据,例如高并发下的数据分布式写入装置40的代码等及各个模块,还可以用于暂时地存储已经输出或者将要输出的数据。
[0180] 处理器52在一些实施例中可以是一中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器或其他数据处理芯片,用于运行存储器51中存储的程序代码或处理数据。
[0181] 该总线53可以是外设部件互连标准(peripheral component interconnect,PCI)总线或扩展工业标准结构(extended industry standard architecture,EISA)总线等。该总线可以分为地址总线、数据总线、控制总线等。为便于表示,图5中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
[0182] 进一步地,所述终端5还可以包括网络接口,网络接口可选的可以包括有线接口和/或无线接口(如WI-FI接口、蓝牙接口等),通常用于在该终端5与其他终端之间建立通信连接。
[0183] 可选地,该终端5还可以包括用户接口,用户接口可以包括显示器(Display)、输入单元比如键盘(Keyboard),可选的用户接口还可以包括标准的有线接口、无线接口。可选地,在一些实施例中,显示器可以是LED显示器、液晶显示器、触控式液晶显示器以及OLED(Organic Light-Emitting Diode,有机发光二极管)触摸器等。其中,显示器也可以适当的称为显示屏或显示单元,用于显示在所述终端5中处理的消息以及用于显示可视化的用户界面。
[0184] 图5仅示出了具有组件51-53以及所述高并发下的数据分布式写入装置40的所述终端5,本领域技术人员可以理解的是,图5示出的结构并不构成对所述终端5的限定,既可以是总线型结构,也可以是星形结构,所述终端5还可以包括比图示更少或者更多的部件,或者组合某些部件,或者不同的部件布置。其他现有的或今后可能出现的电子产品如可适应于本发明,也应包含在本发明的保护范围以内,并以引用方式包含于此。
[0185] 在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。
[0186] 所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘Solid State Disk(SSD))等。
[0187] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0188] 在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0189] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0190] 另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0191] 所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0192] 需要说明的是,上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。并且本文中的术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、装置、物品或者方法不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、装置、物品或者方法所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、装置、物品或者方法中还存在另外的相同要素。
[0193] 以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。