一种数据存储系统和存储方法

文档序号:6542389阅读:260来源:国知局
一种数据存储系统和存储方法
【专利摘要】本发明公开了一种数据存储系统和存储方法,属于数据库处理【技术领域】。该方法包括:根据对第一数据存储器中的数据条目的查询方式构造索引列表;在第二数据存储器中存储该索引列表中的每个索引;将第一数据存储器划分为多个数据区,启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目存储到第二数据存储器中;根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,获取与索引相关联的数据条目标识列表;将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中。本发明能够提高对业务数据的查询效率,并提高了数据条目及索引数据写入到第二数据存储器的速度。
【专利说明】一种数据存储系统和存储方法
【技术领域】
[0001]本发明属于数据库处理【技术领域】,具体涉及一种数据存储系统和存储方法。
【背景技术】
[0002]传统的数据存储和访问的实现方式一般是基于关系型数据库或者是基于nosql数据库的分布式缓存。对于关系型数据库实现方式,数据存储在关系型数据库的磁盘中,应用程序通过sql语句访问数据库中的数据。由于sql语句的语法非常灵活,因此能够支持多种排序和多种分组条件下的复杂查询,即能够支持复杂的查询业务。但是,关系型数据库需要维护数据一致性,并维护大量关联关系,并且数据存储在硬盘上,导致数据查询速度慢,特别是在高并发访问情况下会严重影响查询效率。
[0003]对于nosql数据库实现方式,数据以键-值(key-value)对的方式存储在内存中。在这种实现方式下,由于数据存储在内存中,访问速度快,并且通过标准api(应用程序编程接口)获取数据简单易用。但这种实现方式无法很好的支持多种排序和多种组合条件的复杂查询,无法支持复杂的查询业务。
[0004]可见上述两种数据存储和访问的实现方式各有优劣。而如何在支持复杂的查询业务的前提下提高数据访问效率,就成为亟待解决的技术问题。

【发明内容】

[0005]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的数据存储系统和存储方法。
[0006]根据本发明的一个方面,提供了一种数据存储方法,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该方法包括:
[0007]根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;
[0008]在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称;
[0009]将第一数据存储器划分为多个数据区,启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容;
[0010]根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;以及
[0011]将与每个索弓I相关联的数据条目标识列表与每个索弓I的索引名称相关联地存储到第二数据存储器中。
[0012]可选地,所述根据对第一数据存储器中的数据条目的查询方式构造索引列表,包括:
[0013]根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表;
[0014]根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。
[0015]可选地,所述根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表,包括:
[0016]启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合;
[0017]启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。
[0018]可选地,所述从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,包括:
[0019]将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。
[0020]可选地,所述索引名称包括排序查询方式标识和分组查询方式标识;
[0021]在所述第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,以及数据内容为将数据条目的各个字段进行序列化后得到的内容。
[0022]可选地,所述索引名称还包括数据键值类型;
[0023]在所述第二数据存储器中,每个数据条目的唯一标识还包括数据键值类型,以及数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容;
[0024]其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。
[0025]可选地,所述方法还包括:
[0026]获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值,其中所述键值为数据条目的一个或多个字段名称;
[0027]根据查询方式确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;
[0028]对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器。
[0029]可选地,所述方法还包括:
[0030]获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值;
[0031]根据查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;
[0032]对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。
[0033]可选地,第一数据存储器中的数据条目以关系型数据库方式进行存储;以及[0034]第二数据存储器中的索引以索引名称为键、以相关联的数据条目标识列表为值的键-值方式进行存储,以及数据条目以数据条目的唯一标识为键、以相关联的数据内容为值的键-值方式进行存储。
[0035]根据本发明的另一方面,提供了一种数据存储系统,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该系统包括:
[0036]索引列表构造单元,适于根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;
[0037]索引存储单元,适于在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称;
[0038]数据条目存储单元,适于将第一数据存储器划分为多个数据区,启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容;以及
[0039]关联单元,适于根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;
[0040]其中,所述索引存储单元被配置成将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中。
[0041]可选地,所述索引列表构造单元被配置成:
[0042]根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表;
[0043]根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。
[0044]可选地,所述关联单元被配置成:
[0045]启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合;
[0046]启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。
[0047]可选地,所述关联单元被配置成:
[0048]将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。
[0049]可选地,所述索引名称包括排序查询方式标识和分组查询方式标识;
[0050]在所述第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,以及数据内容为将数据条目的各个字段进行序列化后得到的内容。
[0051]根据本发明的又一方面,提供了一种数据查询系统,包括第一数据存储器、数据发布服务器和第二数据存储器,其中,所述数据发布服务器包括上述的数据存储系统。
[0052]根据本发明的上述一个或多个技术方案,通过采用离线计算代替同步计算,并整合传统关系型数据库和nosql数据库的优点,既满足了对业务数据进行复杂查询的功能要求,又解决了基于传统关系型数据库查询效率较低的问题,特别是提高了高并发环境下的数据查询效率;在离线计算中还采用并行计算技术,通过并行的方式将第一数据存储器中的数据条目及相应的索引数据写入到第二数据存储器中,大幅度提高了数据的写入速度。
[0053]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【专利附图】

【附图说明】
[0054]图1示出了根据本发明一个实施例的数据查询系统的结构示意图;
[0055]图2示出了根据本发明一个实施例的数据存储系统的结构示意图;
[0056]图3示出了根据本发明一个实施例的数据存储方法的流程示意图;以及
[0057]图4示出了本发明实施例中数据和索引的分块并行计算示意图。
【具体实施方式】
[0058]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0059]图1示出了根据本发明一个实施例的数据查询系统的结构示意图。参照图1,本发明实施例的数据查询系统可以包括:第一数据存储器100、数据发布服务器20和第二数据存储器300,其中数据发布服务器20分别与第一数据存储器100和第二数据存储器300通信连接,且数据发布服务器20包括数据存储系统200,即数据存储系统200驻留在数据发布服务器20中。
[0060]数据存储系统200能够从第一数据存储器中100获取各个数据条目,将所获取的数据条目存储到第二数据存储器300中,其中在第二数据存储器300中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容。数据存储系统200还能够根据对第一数据存储器100中的数据条目的各种查询方式构造索引列表(索引列表中的每个索引对应一种查询方式),并将该索引列表中的每个索引存储到第二数据存储器300中,其中在第二数据存储器300中,每个索引包括标识该索引的索引名称以及相关联的数据条目标识列表。
[0061 ] 数据存储系统200还可以采用并行计算技术将第一数据存储器100中的数据条目存储到第二数据存储器300中,和/或,采用并行计算技术将索引列表中的各索引存储到第二数据存储器300中,如此,提高了数据和索引写入到第二数据存储器时的写入速度。
[0062]根据数据存储系统200的上述处理,相当于预先完成了在各种查询方式下对第一数据存储器100中数据条目的查询,并将查询结果存储在第二数据存储器300中,即采用离线计算代替了传统的同步计算。这样,当应用服务器400需要查询第一数据存储器100中的数据条目时,可以直接从第二数据存储器300提供的查询接口来获取查询结果,由于不需要根据具体的查询方式进行实时计算,因此提高了数据查询速度。具体地,所述查询接口接收到应用服务器400发来的查询请求时,先根据所述查询请求中携带的查询方式信息确定索引名称,然后根据索引名称从第二数据存储器200中获取对应的数据条目标识列表,最后根据获取到的数据条目标识列表从第二数据存储器200中获取对应的数据条目集合。[0063]第一数据存储器100可以是关系型数据库,例如Oracle、DB2、Microsoft SQLServer和MySQL等;第二数据存储器200可以是键-值方式的no sql数据库,例如redis数据库。此种情况下,该数据查询系统就整合了传统关系型数据库和nosql数据库的优点,既满足了对业务数据进行复杂查询的功能要求,又解决了基于传统关系型数据库查询效率较低的问题,特别是提高了高并发环境下的数据查询效率。其中,redis是一个key-value存储系统,它支持存储的value类型包括string (字符串)、list (链表)、set (集合)、sortedset (有序集合)和hash (哈希)类型。这些数据类型都支持push/pop、add/remove及取交集、并集和差集及等操作,而且这些操作都是原子性的。
[0064]以下对上述数据查询系统中的数据存储系统200的具体构成和工作原理进行详细描述。
[0065]图2示出了根据本发明一个实施例的数据存储系统的结构示意图。该数据存储系统200可以驻留在数据发布服务器20中,所述数据发布服务器20分别与第一数据存储器100和第二数据存储器300通信连接,通过所述数据存储系统200,能够将来自第一数据存储器100的数据条目存储到第二数据存储器300中,从而完成数据的发布。其中,第一数据存储器100可以是关系型数据库,例如Oracle、DB2、Microsoft SQL Server和MySQL等;第二数据存储器200可以是键-值方式的no sql数据库,例如redis数据库。
[0066]参照图2,本发明实施例的数据存储系统200可以包括:索引列表构造单元210、索引存储单元220、数据条目存储单元230和关联单元240。
[0067]考虑到对业务数据的使用实际情况,在现实中使用的数据查询方式是有限的,因此,索引列表构造单元210可以根据对第一数据存储器100中的数据条目的各种查询方式构造索引列表,也就是说,索引列表中包括多个索引,每个索引对应一种查询方式。
[0068]对数据条目的查询方式一般包括排序查询方式(order by)和分组查询方式(group by),以及二者的组合。order by和group by的数量是有限的,而且大部分的orderby和group by是一起使用的,因此,索引列表构造单元210可以先根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表,然后,根据排序列表和分组列表进行笛卡尔乘积,来构造所述索引列表。当然,对数据条目的查询方式也可以是现有技术中的其他查询方式,甚至是将来有可能出现的其他查询方式,本发明实施例对此不做限制。
[0069]索引列表构造单元210构造完成索引列表后,索引存储单元220可以在第二数据存储器300中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称以及与该索引相关联的数据条目标识列表。在具体实现时,索引存储单元220可以先将索引名称作为键(key)存储到第二存储器300中,对应的值(vlaue)暂时为空。后续,通过关联单元240确定索引名称对应的数据条目标识列表后,再将该数据条目标识列表作为值与对应的索引名称相关联的存储到第二数据存储器300中。例如,对于redis数据库,对应的值的类型可以采用有序集(sorted set),即所存储的数据条目标识列表中的数据条目标识是有序的,其顺序由索引对应的查询方式所确定。
[0070]在一种实现方式中,所述索引名称包括排序查询方式标识(orderID)和分组查询方式标识(groupID)。在另一种实现方式中,所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识。其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。在具体实现时,所述数据键值类型可以直接采用所述键值,也可以是对键值进行编码后的值,且本发明实施例对具体的编码方式不做限制。
[0071]例如,假设数据条目有4个字段,字段名称分别为A、B、C、D,用户查询的键值为{A、C},则所述数据键值类型可以是{A、C},也可以是对{A、C}进行编码后的值例如2。
[0072]数据条目存储单元230适于从第一数据存储器100中获取各个数据条目,将所获取的数据条目存储到第二数据存储器300中,其中在第二数据存储器300中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容。例如对于redis数据库,每个数据条目是以数据条目的唯一标识作为键,以相关联的数据内容作为值进行存储。
[0073]为提高数据处理速度,数据条目存储单元230可以将第一数据存储器100划分为多个数据区,并启动多个第一线程,每个第一线程负责从第一数据存储器100的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器300中,即多个第一线程并行地将第一数据存储器100中的数据条目写入到第二数据存储器300中。
[0074]在具体实现时,数据条目存储单元230可以先判断第一数据存储器100中存储的数据条目的数量是否大于阈值,然后根据判断结果决定是否执行多线程处理。当数据条目的数量大于阈值时,执行所述多线程处理,否则,可以不执行所述多线程处理。其中,所述阈值可以根据经验值和试验确定。
[0075]当所述索引名称包括排序查询方式标识和分组查询方式标识时,则在第二数据存储器300中,每个数据条目的唯一标识为该数据条目在第一数据存储器100中的唯一标识,相关联的数据内容为将数据条目的各个字段进行序列化后得到的内容。例如,当第一数据存储器100为关系型数据库时,该唯一标识可以为数据条目的主键。
[0076]其中,对数据条目的各个字段进行序列化是指:依次取出该数据条目的各个字段的值,将每个字段的值作为一个序列项来组合成一个序列,且各序列项之间用分隔符例如逗号进行分割;或者,依次取出该数据条目的各个字段的值,将每个字段的名称和字段的值作为一个序列项来组合成一个序列,且字段的名称和字段的值之间用分割符例如冒号分害I],各序列项之间用分隔符例如逗号进行分割。
[0077]例如,假设数据条目有4个字段,字段名称分别为A、B、C、D,对应的字段值分别为a, b, c, d,则进行序列化后得到的内容为{a, b, c, d},或者为{A:a, B:b, C:c, D:d}。
[0078]当所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识时,则在第二数据存储器300中,每个数据条目的唯一标识为该数据条目在第一数据存储器100中的唯一标识,相关联的数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容。例如,当第一数据存储器100为关系型数据库时,该唯一标识可以为数据条目的主键。
[0079]例如,假设数据条目有4个字段,字段名称分别为A、B、C、D,对应的字段值分别为a, b,c,d,数据键值类型为{A、C},则进行序列化后得到的内容为{a,c},或者为{A:a,C:c}。
[0080]关联单元240适于根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器300中的唯一标识,获取与该索引相关联的数据条目标识列表。
[0081]每个索引对应一种查询方式,对于每种查询方式,关联单元240可以构造相应的查询语句来从第一数据存储器100中获取相对应的数据条目。例如,当所述第一数据存储器100为关系型数据库时,关联单元240可以根据查询方式构造SQL语句,根据构造的SQL语句对所述第一数据存储器100进行操作,从而获得与该查询方式对应的数据条目。SQL语句示例如下:
[0082]select*from 表名 sort by A group by B。
[0083]关联单元240获取到与该索引相关联的一个或多个数据条目后,确定每个数据条目的唯一标识,例如为数据条目的主键,从而得到与该索引相关联的数据条目标识列表,然后,索引存储单元220可以将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器300中。如此,就将第二数据存储器中存储的索引与该索引对应的数据条目集合关联起来了。
[0084]为提高数据处理速度,关联单元240可以启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器100中确定与所负责的排序查询方式对应的排序数据条目集合;并启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。
[0085]为进一步提高数据处理速度,关联单元240还可以将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。在具体实现时,关联单元240可以先判断排序数据条目集合中的数据条目的数量是否大于阈值,然后根据判断结果决定是否执行多线程处理。当数据条目的数量大于阈值时,执行所述多线程处理,否则,可以不执行所述多线程处理。其中,所述阈值可以根据经验值和试验确定。
[0086]根据本发明实施例的数据存储系统200,通过采用离线计算代替同步计算,有效的提高了数据的查询效率。例如,可以在所述第二数据存储器300中配置查询接口,应用服务器400不需要访问第一数据存储器100进行实时计算,而是直接从查询接口来获取与查询请求对应的数据条目,如此,避免了对第一数据存储器100中数据条目的复杂的查询运算,提高了查询速度。
[0087]如前所述,在一种实现方式中,第二数据存储器中300存储的索引名称包括排序查询方式标识和分组查询方式标识;在另一种实现方式中,所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识。
[0088]对应于上述的两种实现方式,所述查询接口获取查询数据的方式也有两种。在一种实现方式中,查询接口获取数据的过程为:
[0089]获取来自应用服务器400的查询请求,所述查询请求包括查询方式和键值;
[0090]根据查询方式确定索引名称,从第二数据存储器300中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器300中获取相关联的数据内容;
[0091 ] 对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器400。
[0092]其中,去序列化是序列化的逆过程,其具体实现过程本领域技术人员容易根据前述的序列化过程确定。
[0093]在另一种实现方式中,查询接口获取数据的过程为:
[0094]获取来自应用服务器400的查询请求,所述查询请求包括查询方式和键值;
[0095]根据查询方式和键值确定索引名称,从第二数据存储器300中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器300中获取相关联的数据内容;
[0096]对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器400。
[0097]两种实现方式的一个差别在于:在第一种实现方式中,去序列化后的内容是整个数据条目的内容,还需要从中获取与键值对应的内容后再返回给应用服务器;在第二种实现方式中,去序列化后的内容是数据条目中与键值对应的内容,可以直接返回给应用服务器。
[0098]图3示出了根据本发明一个实施例的数据存储方法的流程示意图,该数据存储方法适于将来自第一数据存储器的数据条目存储到第二数据存储器中,其中第一数据存储器可以是关系型数据库,例如0racle、DB2、Microsoft SQL Server和MySQL等,第二数据存储器可以是键-值方式的no sql数据库,例如redis数据库。
[0099]参照图3,所述数据存储器方法可以包括:
[0100]步骤S310,根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;
[0101]对数据条目的查询方式一般包括排序查询方式(order by)和分组查询方式(group by),以及二者的组合。order by和group by的数量是有限的,而且大部分的orderby和group by是一起使用的,因此,可以先根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表;然后,根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。当然,对数据条目的查询方式也可以是现有技术中的其他查询方式,甚至是将来有可能出现的其他查询方式,本发明实施例对此不做限制。
[0102]步骤S320,在第二数据存储器中存储该索引列表中的每个索引;
[0103]在第二数据存储器中,每个索引包括标识该索引的索引名称以及与该索引相关联的数据条目标识列表。在本步骤中,可以先将索引名称作为键(key)存储到第二存储器中,对应的值(vlaue)暂时为空。在后续的步骤中确定了索引名称对应的数据条目标识列表后,再将该数据条目标识列表作为值与对应的索引名称相关联的存储到第二存储器中。例如,对于redis数据库,对应的值的类型可以采用有序集(sorted set),即所存储的数据条目标识列表中的数据条目标识是有序的,其顺序由索引对应的查询方式所确定。
[0104]在一种实现方式中,所述索引名称包括排序查询方式标识(orderID)和分组查询方式标识(groupID)。在另一种实现方式中,所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识。其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。在具体实现时,所述数据键值类型可以直接采用所述键值,也可以是对键值进行编码后的值,且本发明实施例对具体的编码方式不做限制。
[0105]步骤S330,从第一数据存储器中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中;
[0106]在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容。例如对于redis数据库,每个数据条目是以数据条目的唯一标识作为键,以相关联的数据内容作为值进行存储。
[0107]为提高数据处理速度,可以将第一数据存储器划分为多个数据区,并启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,即多个第一线程并行地将第一数据存储器中的数据条目写入到第二数据存储器中。
[0108]在具体实现时,可以先判断第一数据存储器中存储的数据条目的数量是否大于阈值,然后根据判断结果决定是否执行多线程处理。当数据条目的数量大于阈值时,执行所述多线程处理,否则,可以不执行所述多线程处理。其中,所述阈值可以根据经验值和试验确定。
[0109]当所述索引名称包括排序查询方式标识和分组查询方式标识时,则在第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,相关联的数据内容为将数据条目的各个字段进行序列化后得到的内容。例如,当第一数据存储器为关系型数据库时,该唯一标识可以为数据条目的主键。
[0110]当所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识时,则在第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,相关联的数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容。例如,当第一数据存储器为关系型数据库时,该唯一标识可以为数据条目的主键。
[0111]步骤S340,根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;
[0112]每个索引对应一种查询方式,对于每种查询方式,可以构造相应的查询语句来从第一数据存储器中获取相对应的数据条目。例如,当所述第一数据存储器为关系型数据库时,可以根据查询方式构造SQL语句,根据构造的SQL语句对所述第一数据存储器进行操作,从而获得与该查询方式对应的数据条目。
[0113]获取到与该索引相关联的一个或多个数据条目后,再进一步确定每个数据条目的唯一标识,例如为数据条目的主键,从而得到与该索引相关联的数据条目标识列表。
[0114]为提高数据处理速度,可以启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合;并启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。
[0115]为进一步提高数据处理速度,还可以将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。在具体实现时,可以先判断排序数据条目集合中的数据条目的数量是否大于阈值,然后根据判断结果决定是否执行多线程处理。当数据条目的数量大于阈值时,执行所述多线程处理,否则,可以不执行所述多线程处理。其中,所述阈值可以根据经验值和试验确定。
[0116]步骤S350,将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中,如此,就将第二数据存储器中存储的索引与该索引对应的数据条目集合关联起来了。
[0117]根据本发明实施例的数据存储方法,通过采用离线计算代替同步计算,有效的提高了数据的查询效率。例如,可以在所述第二数据存储器中配置查询接口,应用服务器不需要访问第一数据存储器进行实时计算,而是直接从查询接口来获取与查询请求对应的数据条目,如此,避免了对第一数据存储器中数据条目的复杂的查询运算,提高了查询速度。
[0118]也就是说,本发明实施例的数据存储方法还可以包括如下步骤:
[0119]获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值,其中所述键值为数据条目的一个或多个字段名称;
[0120]根据查询方式确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;
[0121 ] 对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器。
[0122]或者,本发明实施例的数据存储方法还可以包括如下步骤:
[0123]获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值;
[0124]根据查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;
[0125]对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。
[0126]以下给出本发明的一个应用实例。
[0127]在该应用实例中,汽车经销商降价排行榜数据存储在传统的关系型数据库中,在该关系型数据库中存储的汽车数据条目包括如下字段名称:
[0128]DealerId SpecId SpecName SpecImage SeriesId SeriesName BrandIdFactoryId NewsId NewsType NewsTitle StartDate EndDate DTime Price OriginalPricePriceOffPercent OrdersLastMonth OrdersLastQuarter CreateTime ModifyTime PIDCID SID KindId NewsTemplateId serieslevel InventoryState PriceScope EquipCarIdPackageName PackagePrice IsRecommend PriceW IsLastWeek
[0129]以下列举该关系型数据库中的3个数据条目:
[0130]数据条目1:1104632012 款 S53.0T Sportback ?/upload/2013/7/19/1_201307191945189324136.jpg2734 奥迪 S533 79 8266471 O 奥迪 S5 现车充足最高优惠 9.46 万元 2013-12-3100:00:00.0002014-01-0500:00:00.0002013-12-3110:35:33.723633400 728000 13 1951 2013-12-31 10:55:00 2013-12-31 10:55:00110000 110100110105 I 2671390 4 O 70 O O O 64 I
[0131]数据条目2:1 10771 2013 款 S64.0TFSI ?/upload/2013/4/19/1_201304191833167634435.jpg2736 奥迪 S633 79 8266541 O 奥迪 S6 现车充足最高优惠 6.93 万元 2013-12-31 00:00:00.000 2014-01-0500:00:00.000 2013-12-3110:37:12.510988700 1058000 7 97 12013-12-31 10:55:00 2013-12-31 10:55:00110000110100 110105 I 26714295 O 100 O O O 99 I
[0132]数据条目3:1122032012 款 30FSI 技术型~/upload/spec/12203/1_201207041848360214178.jpgl8 奥迪 A6L33 9 8266413 O 奥迪 A6L 现车充足最高优惠 11.13 万元 2013-12-31 00:00:00.000 2014-01-0500:00:00.0002013-12-3110:34:25.467 380900 432800 12 1700 5 2013-12-24 18:55:002013-12-3110:55:00 110000110100 110105 I 2671359 5 O 50 O O O 39 I
[0133]对上述降价排行榜数据进行发布的过程如下:
[0134](I)根据对该降价排行榜数据中数据条目的查询方式,构造排序列表(Order by)
如下:
[0135]
new string[] { ”PriccOITPcrcent desc,LessPricc desc,DTime desc*',
tOrdcrsLastMonth dcsc.Pricc dcsc.DTimc desc'*,

ffDTime desc ,Price asc(,f

pPrice desosDTime desc'

lTrice meJDTkm desc'

tOrdcrsLastQiiartcr dcsc5DTimc desc'
fOrdcrsLaslMonlh dcsc,PriccCHTPercenl dcsc,LcssPricc desc,DTime
desc'
fTriccOffPcrcent desc.0rdersLastMonlh dcsc.Pricc asc,DTimc desc”}
[0136]可以看出,在所构造的排序列表中,包括有8种排序查询方式。
[0137]构造分组列表(group by)如下
[0138]new string[] {〃BrandId〃, "Seriesld", "Specld", "PID", "CID", "Brandld, PID",〃BrandId, CID〃, 〃SeriesId, PID〃, 〃SeriesId, CID〃, 〃SpecId, PID〃, 〃SeriesLevel〃}
[0139]可以看出,在所构造的分组列表中,包括有11种分组查询方式。
[0140]然后,对二者进行笛卡尔乘积,得到多个组合,组合数量为8*11=88,即索引列表中包括88个索引,对应88种查询方式。
[0141](2)将每种查询条件作为索引的key存储在redis数据库中,则key为:
[0142]^Promotion(PriceOffPercent desc, LessPrice desc, DTime desc|Specld, PID)"
[0143]对应排序查询条件:
[0144]"PriceOffPercent desc,LessPrice desc, DTime desc"
[0145]对应分组查询条件:
[0146]"Specld, PID"
[0147](3)在redis数据库中以key-value方式存储数据条目的key值和value值,示例如下:
[0148]Key:"Promotion_urn: promotion:92540000014492〃
[0149]Value:"{\"DealerId\":9254,\"SpecId\":14492,\"SpecName\":\"2013\xe6\xac\xbel.6L\xe6\x89\x8b\xe5\x8a\xa8\xe8\x88\x92\xe9\x80\x82\xe7\x89\
【权利要求】
1.一种数据存储方法,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该方法包括: 根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式; 在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称; 将第一数据存储器划分为多个数据区,启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容; 根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;以及 将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中。
2.如权利要求1所述的数据存储方法,其中,所述根据对第一数据存储器中的数据条目的查询方式构造索引列表,包括: 根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表; 根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。
3.如权利要求2所述的数据存储方法,其中,所述根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表,包括: 启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合; 启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。
4.如权利要求3所述的数据存储方法,其中,所述从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,包括: 将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。
5.如权利要求2、3或4所述的数据存储方法,其中,所述索引名称包括排序查询方式标识和分组查询方式标识; 在所述第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,以及数据内容为将数据条目的各个字段进行序列化后得到的内容。
6.如权利要求5所述的数据存储方法,其中,所述索引名称还包括数据键值类型; 在所述第二数据存储器中,每个数据条目的唯一标识还包括数据键值类型,以及数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容; 其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。
7.如权利要求5所述的数据存储方法,其中,还包括: 获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值,其中所述键值为数据条目的一个或多个字段名称; 根据查询方式确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容; 对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器。
8.如权利要求6所述的数据存储方法,其中,还包括: 获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值; 根据查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容; 对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。
9.一种数据存储系统,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该系统包括: 索引列表构造单元,适于根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式; 索引存储单元,适于在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称; 数据条目存储单元,适于将第一数据存储器划分为多个数据区,启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容;以及 关联单元,适于根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表; 其中,所述索引存储单元被配置成将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中。
10.一种数据查询系统,包括第一数据存储器、数据发布服务器和第二数据存储器,其中,所述数据发布服务器包括如权利要求9所述的数据存储系统。
【文档编号】G06F17/30GK103902702SQ201410126243
【公开日】2014年7月2日 申请日期:2014年3月31日 优先权日:2014年3月31日
【发明者】韩明 申请人:北京车商汇软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1