数据分布式存储方法、装置、终端及存储介质
技术领域
本发明涉及数据库技术领域,尤其涉及一种数据分布式存储方法、装置、终端及存储介质。
背景技术
随着大数据和云计算时代的到来,各个领域的数据量呈现出快速增长的趋势。这些不断增长的海量数据通常都是以数据库的形式进行存储。
然而,传统关系型数据库虽然能够保证数据存储的可靠性,但数据库读写性能过低,且大量占用数据库集群的运算能力;现有的分布式数据库系统,例如,BigTable、MongoDB、Cassandra和Redis等,虽然具有较强的数据处理能力,但任是基于单个数据表的操作处理方式,无法有效的打破传统关系型数据库在高并发访问效率上的瓶颈,且在数据呈现出多对多型的关系时,也无法有效的提升访问效率。
因此,有必要提出一种能够解决多对多型的数据的存储的技术问题,以便在高并发访问的情况下提高数据访问的效率。
发明内容
本发明的主要目的在于提供一种数据分布式存储方法、装置、终端及存储介质,旨在解决多对多型的数据的存储的问题,将数据进行分布式存储在正向和反向索引表中,有助于提高在高并发情况下访问数据的效率。
为实现上述目的,本发明第一方面提供一种数据分布式存储方法,应用于终端中,所述方法包括:
获取源数据表;
创建一个正向索引表和一个反向索引表并进行初始化;
根据预设第一规则将所述源数据表中的数据存储于所述正向索引表中;
根据预设第二规则将所述源数据表中的数据存储于所述反向索引表中。
优选的,所述创建一个正向索引表和一个反向索引表并进行初始化包括:
为所述正向索引表创建第一虚拟键和第一虚拟值组成的虚拟键值对,所述第一虚拟键由键及所述键拆分为子键的第一个数构成,所述第一虚拟值由所述子键及每个所述子键对应的值构成;
为所述反向索引表创建第二虚拟键和第二虚拟值组成的虚拟键值对,所述第二虚拟值由值及所述值拆分为子值的第二个数构成,所述第二虚拟键由所述子值及每个所述子值对应的键构成。
优选的,所述根据预设第一规则将所述源数据表中的数据存储于所述正向索引表中包括:
按照顺序遍历所述源数据表中的第一个键及对应所述第一个键的所有值;
将所述第一个键拆分为多个子键,每个所述子键对应一个正向位置索引;
计算所述第一个键的每个值的第一散列值;
根据预设正向位置索引与第一散列值之间的对应关系确定每个所述子键对应的值;
将所述第一个键及对应所述第一个键的所述第一个数存储于所述正向索引表中的所述第一虚拟键中,将所述子键及对应所述子键的值存储于所述正向索引表中的所述第一虚拟值中,其中,每个所述子键对应的值以数组的形式进行存储;
按照顺序遍历所述源数据表中的第二个键直至遍历完所有键,并按照上述步骤依次存储于所述正向索引表中。
优选的,所述方法还包括:
通过预设接口获取所述源数据表中的任意一个键;
判断所述正向索引表中是否存在对应所述键的第一虚拟键;
当确定所述正向索引表中存在对应所述键的第一虚拟键,则遍历所述第一虚拟值中的每个子键及子健对应的值;
将所述第一虚拟值中所有子键对应的值进行合并后输出;
当确定输出的值与所述源数据表的键对应的值相同时,确定所述正向索引表数据存储成功。
优选的,所述根据预设第二规则将所述源数据表中的数据存储于所述反向索引表中包括:
按照顺序遍历所述源数据表中的第一个值及对应所述第一个值的所有键;
将所述第一个值拆分为多个子值,每个所述子值对应一个反向位置索引;
计算所述第一个值的每个键的第二散列值;
根据预设反向位置索引与第二散列值之间的对应关系确定每个所述子值对应的键;
将所述第一个值及对应所述第一个值的所述第二个数存储于所述反向索引表中的所述第二虚拟值中,将所述子值及对应所述子值的键存储于所述反向索引表中的所述第二虚拟键中,其中,每个所述子值对应的键以数组的形式进行存储;
按照顺序遍历所述源数据表中的第二个值直至遍历完所有值,并按照上述步骤依次存储于所述反向索引表中。
优选的,所述方法还包括:
通过预设接口获取所述源数据表中的任意一个值;
判断所述反向索引表中是否存在对应所述值的第二虚拟值;
当确定所述反向索引表中存在对应所述值的第一虚拟值,则遍历所述第一虚拟值中的每个子值及子值对应的键;
将所述第二虚拟键中所有子值对应的键进行合并后输出;
当确定输出的键与所述源数据表的值对应的键相同时,确定所述反向索引表数据存储成功。
优选的,所述散列值采用散列函数计算得到。
为实现上述目的,本发明第二方面提供一种数据分布式存储装置,运行于终端中,所述装置包括:
获取模块,用于获取源数据表;
创建模块,用于创建一个正向索引表和一个反向索引表并进行初始化;
第一存储模块,用于根据预设第一规则将所述源数据表中的数据存储于所述正向索引表中;
第二存储模块,用于根据预设第二规则将所述源数据表中的数据存储于所述反向索引表中。
为实现上述目的,本发明第三方面提供一种终端,所述终端包括存储器和处理器,所述存储器上存储有可在所述处理器上运行的数据分布式存储程序,所述数据分布式存储程序被所述处理器执行时实现所述的数据分布式存储方法。
为实现上述目的,本发明第四方面提供一种计算机可读存储介质,所述计算机可读存储介质上存储有数据分布式存储程序,所述数据分布式存储程序可被一个或者多个处理器执行,以实现所述数据分布式存储方法。
本发明实施例所述的数据分布式存储方法、装置、终端及存储介质,创建一个正向索引表和一个反向索引表并进行初始化,再根据预先设置的不同的规则将数据同时存储于正向索引表和反向索引中。本发明能够解决多对多型的数据的存储的问题,将数据以虚拟化的键-值对的形式分布式存储于正向和反向索引表中,有助于提高在高并发情况下访问数据的效率,且便于后续直接从正向索引表中进行正向索引操作,从反向索引表中进行反向索引操作,保证了索引的高性能,节省CPU的查询效率,同时也有助于后续将新的数据写入正向及反向索引表时,能够提高去重效率,提高写入速度。
附图说明
图1为现有技术中多对多的关系型数据库索引示意图;
图2为本发明第一实施例的数据分布式存储方法的流程示意图;
图3为采用本发明第一实施例所述的数据分布式存储方法创建的数据库的正向索引的示意图;
图4为采用本发明第一实施例所述的数据分布式存储方法创建的数据库的反向索引的示意图;
图5为本发明第二实施例的数据分布式存储装置的结构示意图;
图6为本发明第四实施例揭露的终端的内部结构示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
需要说明的是,在本发明中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。
为便于更清楚的了解本发明的技术方案,现结合图1所示的示意图简单的介绍下现有技术中的关系型数据库索引的相关方案。
关系型数据库使用索引定位表中的行,与普通的的数据表不同,索引是一种以特定顺序保存的专用表,数据库中的键(key)又称为关键字,键(key)用作元素的索引,值(value)则表示所存储和读取的数据。
在如图1所示的关系型数据库中,用通用唯一标识符(Universally UniqueIdentifier,UUID)表示关系型数据库中的索引;用序列号(Serial Number,SN)表示关系型数据库中的索引的键(key),用全局唯一标识符(Globally Unique Identifier,GUID)表示关系型数据库中的键对应的值(value)。
数据库中的一行数据为一条对应关系,SN->GUID为一条正向索引,GUID->SN为一条反向索引。在多对多型的数据库中,相同的SN可以对应多个不同的GUID,不同的SN可以对应多个相同的GUID。
关系型数据库基于事务的处理方式导致数据库的读写性能较差,且大量占用数据库集群的运算能力,尤其是在多个并发请求的情况下,可能会直接导致关系型数据库崩溃。
实施例一
图2为本发明第一实施例的数据分布式存储方法的流程示意图。
所述数据分布式存储方法可以应用于终端中,也可以应用于数据库服务器中。对于需要创建分布式数据库索引的终端,可以直接在终端上集成本发明的方法所提供的创建分布式数据库索引的功能。或者以软件开发工具包(Software Development Kit,SDK)的形式提供创建分布式数据库索引的功能的接口,终端通过所提供的接口实现数据分布式存储。
如图2所示,所述数据分布式存储方法具体包括以下步骤,根据不同的需求,该流程图中步骤的顺序可以改变,某些步骤可以省略。
S21,获取源数据表。
本实施例中的源数据表中的数据以多对多的关系型数据为例进行说名,在多对多的关系型数据中,相同的键可以对应多个不同的值,相同的值可以对应多个不同的键。例如,图1中,同一个键“SN_05”对应多个不同的值:“GUID_0024”、“GUID_0028”、“GUID_0027”,不同的键“SN_05”及“SN_06”对应一个相同的值“GUID_0024”。
S22,创建一个正向索引表和一个反向索引表并进行初始化。
本实施例中,需要创建一个正向索引表和一个反向索引表,并对正向索引表和反向索引表均进行初始化。
优选的,所述创建一个正向索引表和一个反向索引表并进行初始化包括:
为所述正向索引表创建第一虚拟键和第一虚拟值组成的虚拟键值对,所述第一虚拟键由键及所述键拆分为子键的第一个数构成,所述第一虚拟值由所述子键及每个所述子键对应的值构成;
为所述反向索引表创建第二虚拟键和第二虚拟值组成的虚拟键值对,所述第二虚拟值由值及所述值拆分为子值的第二个数构成,所述第二虚拟键由所述子值及每个所述子值对应的键构成。
本实施例中,创建两个索引表,每个索引表中的数据为虚拟键值对的形式。正向索引表便于进行正向索引操作,反向索引表便于进行反向索引操作。
创建的所述正向索引表包括:多个第一虚拟键和多个第一虚拟值,其中,第一虚拟值中包括多个子键,每个子键对应0个、1个或者多个值,每个子键的多个值以数组的形式存放。即,关系型数据库中的键,此时在正向索引表中被虚拟化为键和对应所述键的子键的第一个数(键和键的子键的第一个数合起来可以记作第一info,其中,键拆分为子健的第一个数为预先配置的常量);关系型数据库中的键的值,此时在正向索引表中被虚拟化为所述子键(子健可以记作第一shard)及对应所述子键的值,且所述子键的值采用数组的形式进行存储。
创建的所述反向索引表包括:多个第二虚拟键和多个第二虚拟值,其中,第二虚拟值中包括多个子值,每个子值对应0个、1个或者多个键,每个子值的多个键以数组的形式存放。即,关系型数据库中的值,此时在反向索引表中被虚拟化为值和对应所述值的第二子值的个数(值和值的子值的第二个数合起来可以记作第二info,其中,值拆分为子值的第二个数为预先配置的常量);关系型数据库中的值的键,此时在反向索引表中被虚拟化为所述子值(子值可以记作第二shard)及对应所述子值的键,且所述子值的键采用数组的形式进行存储。
S23,根据预设第一规则将所述源数据表中的数据存储于所述正向索引表中。
在初始化正向索引表之后,可以根据预先设置的第一规则将源数据表中的数据存储在正向索引表中。
优选的,所述根据预设第一规则将所述源数据表中的数据存储于所述正向索引表中包括:
1)按照顺序遍历所述源数据表中的第一个键及对应所述第一个键的所有值;
首先遍历源数据表中的第一行的第一个键,然后遍历源数据表中对应第一个键的所有值。
2)将所述第一个键拆分为多个子键,每个所述子键对应一个正向位置索引;
将第一个键拆分为第一个数的子键,且一个子键对应一个正向位置索引,所述正向位置索引包括位置序号。
3)计算所述第一个键的每个值的第一散列值;
本实施例中,所述第一个键的每个值的第一散列值可以采用散列函数计算得到。关于散列函数为现有技术,本发明在此不做详细赘述。
4)根据预设正向位置索引与第一散列值之间的对应关系确定每个所述子键对应的值;
预先建立了正向位置索引中的第一位置序号与第一散列值之间的对应关系,计算得到每个值的第一散列值之后,可以匹配出与第一散列值对应的第一位置序号,再根据第一位置序号匹配出对应的第一子键。
5)将所述第一个键及对应所述第一个键的所述第一个数存储于所述正向索引表中的所述第一虚拟键中,将所述子键及对应所述子键的值存储于所述正向索引表中的所述第一虚拟值中,其中,每个所述子键对应的值以数组的形式进行存储;
6)按照顺序遍历所述源数据表中的第二个键直至遍历完所有键,并按照上述步骤依次存储于所述正向索引表中。
示例性,假设源数据表如图1所示,首先遍历所述源数据表中的第一个键“SN_05”及对应“SN_05”的所有值“GUID_0024”、“GUID_0028”、“GUID_0027”;统计第一个键“SN_05”的所有值的第一个数为3;将所述第一个键“SN_05”拆分为3个子键“SN_05_0”、“SN_05_1”、“SN_05_2”,并为3个子键均配置一个正向位置索引,正向位置索引中的位置序号分别为序号0、序号1、序号2;计算值“GUID_0024”的散列值为0、值“GUID_0028”的散列值为2、值“GUID_0027”的散列值为0;则确定子键“SN_05_0”与值“GUID_0024”和值“GUID_0027”对应,子键“SN_05_2”与值“GUID_0028”对应;将第一个键“SN_05”及第一个数3存储于正向索引表中的第一虚拟键中,将子键“SN_05_0”及对应的值“GUID_0024”和值“GUID_0027”存储于正向索引表中的第一虚拟值中,将子键“SN_05_1”存储于正向索引表中的下一行的第一虚拟值中,将子键“SN_05_2”及对应的值“GUID_0028”存储于正向索引表中的再下一行的第一虚拟值中。接着遍历所述源数据表中的第二个键,以此类推,直至遍历完所述源数据表中的所有键及对应键的值,得到如图2所示的正向索引表。
S24,根据预设第二规则将所述源数据表中的数据存储于所述反向索引表中。
在初始化反向索引表之后,可以根据预先设置的第二规则将源数据表中的数据存储在反向索引表中。
优选的,所述根据预设第二规则将所述源数据表中的数据存储于所述反向索引表中包括:
1)按照顺序遍历所述源数据表中的第一个值及对应所述第一个值的所有键;
首先遍历源数据表中的第一行的第一个值,然后遍历源数据表中对应第一个值的所有键。
2)将所述第一个值拆分为多个子值,每个所述子值对应一个反向位置索引;
将第一个值拆分为第一个数的子值,且一个子值对应一个反向位置索引,所述反向位置索引包括第二位置序号。
3)计算所述第一个值的每个键的第二散列值;
本实施例中,所述第一个值的每个键的第二散列值可以采用散列函数计算得到。关于散列函数为现有技术,本发明在此不做详细赘述。
4)根据预设反向位置索引与第二散列值之间的对应关系确定每个所述子值对应的键;
预先建立了反向位置索引中的第二位置序号与第二散列值之间的对应关系,计算得到每个值的第二散列值之后,可以匹配出与第二散列值对应的第二位置序号,再根据第二位置序号匹配出对应的第一子值。
5)将所述第一个值及对应所述第一个值的所述第二个数存储于所述反向索引表中的所述第二虚拟值中,将所述子值及对应所述子值的键存储于所述反向索引表中的所述第二虚拟键中,其中,每个所述子值对应的键以数组的形式进行存储;
6)按照顺序遍历所述源数据表中的第二个值直至遍历完所有值,并按照上述步骤依次存储于所述反向索引表中。
示例性,假设源数据表如图1所示,首先遍历所述源数据表中的第一个值“GUID_0024”及对应“GUID_0024”的所有键“SN_05”、“SN_06”;统计第一个值“GUID_0024”的所有键的第二个数为2;将所述第一个值“GUID_0024”拆分为2个子值“GUID_0024_0”、“GUID_0024_1”,并为2个子值均配置一个反向位置索引,反向位置索引中的位置序号分别为序号0、序号1;计算键“SN_05”的散列值为0、键“SN_06”的散列值为1;则确定子值“GUID_0024_0”与键“SN_05”对应,子值“GUID_0024_1”与键“SN_06”对应;将第一个键“GUID_0024”及第二个数2存储于反向索引表中的第二虚拟键中,将子值“GUID_0024_0”及对应的键“SN_05”存储于反向索引表中的第二虚拟值中,将子值“GUID_0024_1”及对应的键“SN_06”存储于反向索引表中的下一行的第二虚拟值中。接着遍历所述源数据表中的第二个值,以此类推,直至遍历完所述源数据表中的所有值及对应值的键,得到如图3所示的反向索引表。
在将源数据表中的数据分布式存储于正向索引表和反向索引表中后,可以进一步验证所述正向索引表和所述反向索引表中的数据的正确性。
进一步的,为了验证所述正向索引表的正确性,可以对正向索引表进行查询操作,所述方法还包括:
通过预设接口获取所述源数据表中的任意一个键;
判断所述正向索引表中是否存在对应所述键的第一虚拟键;
当确定所述正向索引表中存在对应所述键的第一虚拟键,则遍历所述第一虚拟值中的每个子键及子健对应的值;
将所述第一虚拟值中所有子键对应的值进行合并后输出;
当确定输出的值与所述源数据表的键对应的值相同时,确定所述正向索引表数据存储成功。
本实施例中,用户可以通过预设接口,例如上层逻辑调用接口或者人机交互接口,输入源数据表中的任意一个键,查询所述正向索引数据表中的该键的值。终端首先判断是否存在对应所获取的键的第一虚拟键,当第一虚拟键中的键与所获取的键相同时,再逐行遍历第一虚拟键对应的第一虚拟值中的子键及子键对应的值;最后按照预设的合并规则将所述子键对应的值合并在一起并输出。当确定输出的值与源数据表对应所述键的值相同,则认为所述正向索引表数据存储成功。否则,当所述正向索引表中不存在对应所获取的键的第一虚拟键;或者当所述正向索引表中存在对应所获取的键的第一虚拟键,但遍历出的子键对应的值与源数据表的键对应的值不同时,则认为所述正向索引表数据存储失败。
由于键拆分为子键的正向位置索引与第一散列值具有对应关系,且子键对应的值是根据值的第一散列值计算得到的,因此,若正向索引表数据存储成功,则必定会查询出用户所输入的键的所有值且合并输出的值不会存在重复的现象。
优选的,为了验证所述反向索引表的正确性,可以对反向索引表进行查询操作,所述方法还包括:
通过预设接口获取所述源数据表中的任意一个值;
判断所述反向索引表中是否存在对应所述值的第二虚拟值;
当确定所述反向索引表中存在对应所述值的第一虚拟值,则遍历所述第一虚拟值中的每个子值及子值对应的键;
将所述第二虚拟键中所有子值对应的键进行合并后输出;
当确定输出的键与所述源数据表的值对应的键相同时,确定所述反向索引表数据存储成功。
本实施例中,用户可以通过预设接口,例如上层逻辑调用接口或者人机交互接口,输入源数据表中的任意一个键,查询所述正向索引数据表中的该键的值。终端首先判断是否存在对应所获取的值的第二虚拟值,当第一虚拟值中的值与所获取的值相同时,再逐行遍历第一虚拟值对应的第一虚拟键中的子值及子值对应的键;最后按照预设的合并规则将所述子值对应的键合并在一起并输出。当确定输出的键与源数据表对应所述值的键相同,则认为所述反向索引表数据存储成功。否则,当所述反向索引表中不存在对应所获取的值的第二虚拟值;或者当所述反向索引表中存在对应所获取的值的第二虚拟值,但遍历出的子值对应的键与源数据表的值对应的键不同时,则认为所述反向索引表数据存储失败。
由于值拆分为子值的反向位置索引与第二散列值具有对应关系,且子值对应的键是根据键的第二散列值计算得到的,因此,若反向索引表数据存储成功,则必定会查询出用户所输入的值的所有键且合并输出的键不会存在重复的现象。
本实施例中,采用合并规则表达式合并所查询出的值或者键,所述合并规则表达式可以为:冒号前面的部分代表键或者值,冒号后面的部分代表键对应的多个值或者值对应的多个键,多个值或者多个键采用分号隔开。例如,从正向索引表中查询出键“SN_05”对应的所有的值经过合并并输出为“SN_05:GUID_0024;GUID_0027;GUID_0028”。再如,从反向索引表中查询出值“GUID_0027”对应的所有的键经过合并并输出为“GUID_0027:SN_05;SN_06”。
本发明实施例所述的数据分布式存储方法,创建一个正向索引表和一个反向索引表并进行初始化,再根据预先设置的不同的规则将数据同时存储于正向索引表和反向索引中。本发明能够解决多对多型的数据的存储的问题,将数据以虚拟化的键-值对的形式分布式存储于正向和反向索引表中,有助于提高在高并发情况下访问数据的效率,且便于后续直接从正向索引表中进行正向索引操作,从反向索引表中进行反向索引操作,保证了索引的高性能,节省CPU的查询效率,同时也有助于后续将新的数据写入正向及反向索引表时,能够提高去重效率,提高写入速度。
上述图2-图4详细介绍了本发明的数据分布式存储方法,下面结合第5~6图,分别对实现所述数据分布式存储方法的软件系统的功能模块以及硬件装置架构进行介绍。
应该了解,所述实施例仅为说明之用,在专利申请范围上并不受此结构的限制。
实施例二
参阅图5所示,为本发明一实施例揭露的数据分布式存储装置的功能模块示意图。
在一些实施例中,所述数据分布式存储装置50运行于终端中。所述数据分布式存储装置50可以包括多个由程序代码段所组成的功能模块。所述数据分布式存储装置50中的各个程序段的程序代码可以存储于终端的存储器中,并由所述至少一个处理器所执行,以执行(详见图2描述)将数据进行分布式存储。
本实施例中,所述数据分布式存储装置50根据其所执行的功能,可以被划分为多个功能模块。所述功能模块可以包括:获取模块501、创建模块502、第一存储模块503、第二存储模块504、判断模块505、遍历模块506、合并模块507及确定模块508。本发明所称的模块是指一种能够被至少一个处理器所执行并且能够完成固定功能的一系列计算机程序段,其存储在存储器中。在本实施例中,关于各模块的功能将在后续的实施例中详述。
获取模块501,用于获取源数据表。
本实施例中的源数据表中的数据以多对多的关系型数据为例进行说名,在多对多的关系型数据中,相同的键可以对应多个不同的值,相同的值可以对应多个不同的键。例如,图1中,同一个键“SN_05”对应多个不同的值:“GUID_0024”、“GUID_0028”、“GUID_0027”,不同的键“SN_05”及“SN_06”对应一个相同的值“GUID_0024”。
创建模块502,用于创建一个正向索引表和一个反向索引表并进行初始化。
本实施例中,需要创建一个正向索引表和一个反向索引表,并对正向索引表和反向索引表均进行初始化。
优选的,所述创建模块502创建一个正向索引表和一个反向索引表并进行初始化包括:
为所述正向索引表创建第一虚拟键和第一虚拟值组成的虚拟键值对,所述第一虚拟键由键及所述键拆分为子键的第一个数构成,所述第一虚拟值由所述子键及每个所述子键对应的值构成;
为所述反向索引表创建第二虚拟键和第二虚拟值组成的虚拟键值对,所述第二虚拟值由值及所述值拆分为子值的第二个数构成,所述第二虚拟键由所述子值及每个所述子值对应的键构成。
本实施例中,创建两个索引表,每个索引表中的数据为虚拟键值对的形式。正向索引表便于进行正向索引操作,反向索引表便于进行反向索引操作。
创建的所述正向索引表包括:多个第一虚拟键和多个第一虚拟值,其中,第一虚拟值中包括多个子键,每个子键对应0个、1个或者多个值,每个子键的多个值以数组的形式存放。即,关系型数据库中的键,此时在正向索引表中被虚拟化为键和对应所述键的子键的第一个数(键和键的子键的第一个数合起来可以记作第一info,其中,键拆分为子健的第一个数为预先配置的常量);关系型数据库中的键的值,此时在正向索引表中被虚拟化为所述子键(子健可以记作第一shard)及对应所述子键的值,且所述子键的值采用数组的形式进行存储。
创建的所述反向索引表包括:多个第二虚拟键和多个第二虚拟值,其中,第二虚拟值中包括多个子值,每个子值对应0个、1个或者多个键,每个子值的多个键以数组的形式存放。即,关系型数据库中的值,此时在反向索引表中被虚拟化为值和对应所述值的子值的第二个数(值和值的子值的第二个数合起来可以记作第二info,其中,值拆分为子值的第二个数为预先配置的常量);关系型数据库中的值的键,此时在反向索引表中被虚拟化为所述子值(子值可以记作第二shard)及对应所述子值的键,且所述子值的键采用数组的形式进行存储。
第一存储模块503,用于根据预设第一规则将所述源数据表中的数据存储于所述正向索引表中。
在初始化正向索引表之后,可以根据预先设置的第一规则将源数据表中的数据存储在正向索引表中。
优选的,所述第一存储模块503根据预设第一规则将所述源数据表中的数据存储于所述正向索引表中包括:
1)按照顺序遍历所述源数据表中的第一个键及对应所述第一个键的所有值;
首先遍历源数据表中的第一行的第一个键,然后遍历源数据表中对应第一个键的所有值。
2)将所述第一个键拆分为多个子键,每个所述子键对应一个正向位置索引;
将第一个键拆分为第一个数的子键,且一个子键对应一个正向位置索引,所述正向位置索引包括位置序号。
3)计算所述第一个键的每个值的第一散列值;
本实施例中,所述第一个键的每个值的第一散列值可以采用散列函数计算得到。关于散列函数为现有技术,本发明在此不做详细赘述。
4)根据预设正向位置索引与第一散列值之间的对应关系确定每个所述子键对应的值;
预先建立了正向位置索引中的第一位置序号与第一散列值之间的对应关系,计算得到每个值的第一散列值之后,可以匹配出与第一散列值对应的第一位置序号,再根据第一位置序号匹配出对应的第一子键。
5)将所述第一个键及对应所述第一个键的所述第一个数存储于所述正向索引表中的所述第一虚拟键中,将所述子键及对应所述子键的值存储于所述正向索引表中的所述第一虚拟值中,其中,每个所述子键对应的值以数组的形式进行存储;
6)按照顺序遍历所述源数据表中的第二个键直至遍历完所有键,并按照上述步骤依次存储于所述正向索引表中。
示例性,假设源数据表如图1所示,首先遍历所述源数据表中的第一个键“SN_05”及对应“SN_05”的所有值“GUID_0024”、“GUID_0028”、“GUID_0027”;统计第一个键“SN_05”的所有值的第一个数为3;将所述第一个键“SN_05”拆分为3个子键“SN_05_0”、“SN_05_1”、“SN_05_2”,并为3个子键均配置一个正向位置索引,正向位置索引中的位置序号分别为序号0、序号1、序号2;计算值“GUID_0024”的散列值为0、值“GUID_0028”的散列值为2、值“GUID_0027”的散列值为0;则确定子键“SN_05_0”与值“GUID_0024”和值“GUID_0027”对应,子键“SN_05_2”与值“GUID_0028”对应;将第一个键“SN_05”及第一个数3存储于正向索引表中的第一虚拟键中,将子键“SN_05_0”及对应的值“GUID_0024”和值“GUID_0027”存储于正向索引表中的第一虚拟值中,将子键“SN_05_1”存储于正向索引表中的下一行的第一虚拟值中,将子键“SN_05_2”及对应的值“GUID_0028”存储于正向索引表中的再下一行的第一虚拟值中。接着遍历所述源数据表中的第二个键,以此类推,直至遍历完所述源数据表中的所有键及对应键的值,得到如图2所示的正向索引表。
第二存储模块504,用于根据预设第二规则将所述源数据表中的数据存储于所述反向索引表中。
在初始化反向索引表之后,可以根据预先设置的第二规则将源数据表中的数据存储在反向索引表中。
优选的,所述第二存储模块504根据预设第二规则将所述源数据表中的数据存储于所述反向索引表中包括:
1)按照顺序遍历所述源数据表中的第一个值及对应所述第一个值的所有键;
首先遍历源数据表中的第一行的第一个值,然后遍历源数据表中对应第一个值的所有键。
2)将所述第一个值拆分为多个子值,每个所述子值对应一个反向位置索引;
将第一个值拆分为第一个数的子值,且一个子值对应一个反向位置索引,所述反向位置索引包括第二位置序号。
3)计算所述第一个值的每个键的第二散列值;
本实施例中,所述第一个值的每个键的第二散列值可以采用散列函数计算得到。关于散列函数为现有技术,本发明在此不做详细赘述。
4)根据预设反向位置索引与第二散列值之间的对应关系确定每个所述子值对应的键;
预先建立了反向位置索引中的第二位置序号与第二散列值之间的对应关系,计算得到每个值的第二散列值之后,可以匹配出与第二散列值对应的第二位置序号,再根据第二位置序号匹配出对应的第一子值。
5)将所述第一个值及对应所述第一个值的所述第二个数存储于所述反向索引表中的所述第二虚拟值中,将所述子值及对应所述子值的键存储于所述反向索引表中的所述第二虚拟键中,其中,每个所述子值对应的键以数组的形式进行存储;
6)按照顺序遍历所述源数据表中的第二个值直至遍历完所有值,并按照上述步骤依次存储于所述反向索引表中。
示例性,假设源数据表如图1所示,首先遍历所述源数据表中的第一个值“GUID_0024”及对应“GUID_0024”的所有键“SN_05”、“SN_06”;统计第一个值“GUID_0024”的所有键的第二个数为2;将所述第一个值“GUID_0024”拆分为2个子值“GUID_0024_0”、“GUID_0024_1”,并为2个子值均配置一个反向位置索引,反向位置索引中的位置序号分别为序号0、序号1;计算键“SN_05”的散列值为0、键“SN_06”的散列值为1;则确定子值“GUID_0024_0”与键“SN_05”对应,子值“GUID_0024_1”与键“SN_06”对应;将第一个键“GUID_0024”及第二个数2存储于反向索引表中的第二虚拟键中,将子值“GUID_0024_0”及对应的键“SN_05”存储于反向索引表中的第二虚拟值中,将子值“GUID_0024_1”及对应的键“SN_06”存储于反向索引表中的下一行的第二虚拟值中。接着遍历所述源数据表中的第二个值,以此类推,直至遍历完所述源数据表中的所有值及对应值的键,得到如图3所示的反向索引表。
在将源数据表中的数据分布式存储于正向索引表和反向索引表中后,可以进一步验证所述正向索引表和所述反向索引表中的数据的正确性。
进一步的,为了验证所述正向索引表的正确性,可以对正向索引表进行查询操作:
所述获取模块501,还用于通过预设接口获取所述源数据表中的任意一个键。
判断模块505,用于判断所述正向索引表中是否存在对应所述键的第一虚拟键;
遍历模块506,用于当所述判断模块505确定所述正向索引表中存在对应所述键的第一虚拟键,则遍历所述第一虚拟值中的每个子键及子健对应的值;
合并模块507,用于输出模块将所述第一虚拟值中所有子键对应的值进行合并后输出;
确定模块508,用于当确定输出的值与所述源数据表的键对应的值相同时,确定所述正向索引表数据存储成功。
本实施例中,用户可以通过预设接口,例如上层逻辑调用接口或者人机交互接口,输入源数据表中的任意一个键,查询所述正向索引数据表中的该键的值。终端首先判断是否存在对应所获取的键的第一虚拟键,当第一虚拟键中的键与所获取的键相同时,再逐行遍历第一虚拟键对应的第一虚拟值中的子键及子键对应的值;最后按照预设的合并规则将所述子键对应的值合并在一起并输出。当确定输出的值与源数据表对应所述键的值相同,则认为所述正向索引表数据存储成功。否则,当所述正向索引表中不存在对应所获取的键的第一虚拟键;或者当所述正向索引表中存在对应所获取的键的第一虚拟键,但遍历出的子键对应的值与源数据表的键对应的值不同时,则认为所述正向索引表数据存储失败。
由于键拆分为子键的正向位置索引与第一散列值具有对应关系,且子键对应的值是根据值的第一散列值计算得到的,因此,若正向索引表数据存储成功,则必定会查询出用户所输入的键的所有值且合并输出的值不会存在重复的现象。
优选的,为了验证所述反向索引表的正确性,可以对反向索引表进行查询操作:
所述获取模块501,还用于通过预设接口获取所述源数据表中的任意一个值;
所述判断模块505,还用于判断所述反向索引表中是否存在对应所述值的第二虚拟值;
所述遍历模块506,还用于当所述判断模块505确定所述反向索引表中存在对应所述值的第一虚拟值,则遍历所述第一虚拟值中的每个子值及子值对应的键;
所述合并模块507,还用于将所述第二虚拟键中所有子值对应的键进行合并后输出;
所述确定模块508,还用于当确定输出的键与所述源数据表的值对应的键相同时,确定所述反向索引表数据存储成功。
本实施例中,用户可以通过预设接口,例如上层逻辑调用接口或者人机交互接口,输入源数据表中的任意一个键,查询所述正向索引数据表中的该键的值。终端首先判断是否存在对应所获取的值的第二虚拟值,当第一虚拟值中的值与所获取的值相同时,再逐行遍历第一虚拟值对应的第一虚拟键中的子值及子值对应的键;最后按照预设的合并规则将所述子值对应的键合并在一起并输出。当确定输出的键与源数据表对应所述值的键相同,则认为所述反向索引表数据存储成功。否则,当所述反向索引表中不存在对应所获取的值的第二虚拟值;或者当所述反向索引表中存在对应所获取的值的第二虚拟值,但遍历出的子值对应的键与源数据表的值对应的键不同时,则认为所述反向索引表数据存储失败。
由于值拆分为子值的反向位置索引与第二散列值具有对应关系,且子值对应的键是根据键的第二散列值计算得到的,因此,若反向索引表数据存储成功,则必定会查询出用户所输入的值的所有键且合并输出的键不会存在重复的现象。
本实施例中,采用合并规则表达式合并所查询出的值或者键,所述合并规则表达式可以为:冒号前面的部分代表键或者值,冒号后面的部分代表键对应的多个值或者值对应的多个键,多个值或者多个键采用分号隔开。例如,从正向索引表中查询出键“SN_05”对应的所有的值经过合并并输出为“SN_05:GUID_0024;GUID_0027;GUID_0028”。再如,从反向索引表中查询出值“GUID_0027”对应的所有的键经过合并并输出为“GUID_0027:SN_05;SN_06”。
本发明实施例所述的数据分布式存储装置,创建一个正向索引表和一个反向索引表并进行初始化,再根据预先设置的不同的规则将数据同时存储于正向索引表和反向索引中。本发明能够解决多对多型的数据的存储的问题,将数据以虚拟化的键-值对的形式分布式存储于正向和反向索引表中,有助于提高在高并发情况下访问数据的效率,且便于后续直接从正向索引表中进行正向索引操作,从反向索引表中进行反向索引操作,保证了索引的高性能,节省CPU的查询效率,同时也有助于后续将新的数据写入正向及反向索引表时,能够提高去重效率,提高写入速度。
实施例三
图6为本发明一实施例揭露的终端的内部结构示意图。
在本实施例中,终端6可以是固定终端,也可以是移动终端。
所述终端6可以包括存储器61、处理器62和总线63。
其中,存储器61至少包括一种类型的可读存储介质,所述可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、磁性存储器、磁盘、光盘等。存储器61在一些实施例中可以是所述终端6的内部存储单元,例如所述终端6的硬盘。存储器61在另一些实施例中也可以是所述终端6的外部存储设备,例如所述终端6上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(FlashCard)等。进一步地,存储器61还可以既包括所述终端6的内部存储单元也包括外部存储设备。存储器61不仅可以用于存储安装于所述终端6的应用软件及各类数据,例如数据分布式存储装置50的代码等及各个模块,还可以用于暂时地存储已经输出或者将要输出的数据。
处理器62在一些实施例中可以是一中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器或其他数据处理芯片,用于运行存储器61中存储的程序代码或处理数据。
该总线63可以是外设部件互连标准(peripheral component interconnect,PCI)总线或扩展工业标准结构(extended industry standard architecture,EISA)总线等。该总线可以分为地址总线、数据总线、控制总线等。为便于表示,图6中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
进一步地,所述终端6还可以包括网络接口,网络接口可选的可以包括有线接口和/或无线接口(如WI-FI接口、蓝牙接口等),通常用于在该终端6与其他终端之间建立通信连接。
可选地,该终端6还可以包括用户接口,用户接口可以包括显示器(Display)、输入单元比如键盘(Keyboard),可选的用户接口还可以包括标准的有线接口、无线接口。可选地,在一些实施例中,显示器可以是LED显示器、液晶显示器、触控式液晶显示器以及OLED(Organic Light-Emitting Diode,有机发光二极管)触摸器等。其中,显示器也可以适当的称为显示屏或显示单元,用于显示在所述终端6中处理的消息以及用于显示可视化的用户界面。
图6仅示出了具有组件61-63以及所述数据分布式存储装置50的所述终端6,本领域技术人员可以理解的是,图6示出的结构并不构成对所述终端6的限定,既可以是总线型结构,也可以是星形结构,所述终端6还可以包括比图示更少或者更多的部件,或者组合某些部件,或者不同的部件布置。其他现有的或今后可能出现的电子产品如可适应于本发明,也应包含在本发明的保护范围以内,并以引用方式包含于此。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。
所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘Solid State Disk(SSD))等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。并且本文中的术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、装置、物品或者方法不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、装置、物品或者方法所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、装置、物品或者方法中还存在另外的相同要素。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。