一种数据存储系统和存储方法\n技术领域\n[0001] 本发明属于数据库处理技术领域,具体涉及一种数据存储系统和存储方法。\n背景技术\n[0002] 传统的数据存储和访问的实现方式一般是基于关系型数据库或者是基于nosql数据库的分布式缓存。对于关系型数据库实现方式,数据存储在关系型数据库的磁盘中,应用程序通过sql语句访问数据库中的数据。由于sql语句的语法非常灵活,因此能够支持多种排序和多种分组条件下的复杂查询,即能够支持复杂的查询业务。但是,关系型数据库需要维护数据一致性,并维护大量关联关系,并且数据存储在硬盘上,导致数据查询速度慢,特别是在高并发访问情况下会严重影响查询效率。\n[0003] 对于nosql数据库实现方式,数据以键-值(key-value)对的方式存储在内存中。在这种实现方式下,由于数据存储在内存中,访问速度快,并且通过标准api(应用程序编程接口)获取数据简单易用。但这种实现方式无法很好的支持多种排序和多种组合条件的复杂查询,无法支持复杂的查询业务。\n[0004] 可见上述两种数据存储和访问的实现方式各有优劣。而如何在支持复杂的查询业务的前提下提高数据访问效率,就成为亟待解决的技术问题。\n发明内容\n[0005] 鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的数据存储系统和存储方法。\n[0006] 根据本发明的一个方面,提供了一种数据存储方法,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该方法包括:\n[0007] 根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;\n[0008] 在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称;\n[0009] 将第一数据存储器划分为多个数据区,启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容;\n[0010] 根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;\n以及\n[0011] 将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中。\n[0012] 可选地,所述根据对第一数据存储器中的数据条目的查询方式构造索引列表,包括:\n[0013] 根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表;\n[0014] 根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。\n[0015] 可选地,所述根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表,包括:\n[0016] 启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合;\n[0017] 启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。\n[0018] 可选地,所述从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,包括:\n[0019] 将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。\n[0020] 可选地,所述索引名称包括排序查询方式标识和分组查询方式标识;\n[0021] 在所述第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,以及数据内容为将数据条目的各个字段进行序列化后得到的内容。\n[0022] 可选地,所述索引名称还包括数据键值类型;\n[0023] 在所述第二数据存储器中,每个数据条目的唯一标识还包括数据键值类型,以及数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容;\n[0024] 其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。\n[0025] 可选地,所述方法还包括:\n[0026] 获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值,其中所述键值为数据条目的一个或多个字段名称;\n[0027] 根据查询方式确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;\n[0028] 对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器。\n[0029] 可选地,所述方法还包括:\n[0030] 获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值;\n[0031] 根据查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;\n[0032] 对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。\n[0033] 可选地,第一数据存储器中的数据条目以关系型数据库方式进行存储;以及[0034] 第二数据存储器中的索引以索引名称为键、以相关联的数据条目标识列表为值的键-值方式进行存储,以及数据条目以数据条目的唯一标识为键、以相关联的数据内容为值的键-值方式进行存储。\n[0035] 根据本发明的另一方面,提供了一种数据存储系统,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该系统包括:\n[0036] 索引列表构造单元,适于根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;\n[0037] 索引存储单元,适于在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称;\n[0038] 数据条目存储单元,适于将第一数据存储器划分为多个数据区,启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容;以及\n[0039] 关联单元,适于根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;\n[0040] 其中,所述索引存储单元被配置成将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中。\n[0041] 可选地,所述索引列表构造单元被配置成:\n[0042] 根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表;\n[0043] 根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。\n[0044] 可选地,所述关联单元被配置成:\n[0045] 启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合;\n[0046] 启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。\n[0047] 可选地,所述关联单元被配置成:\n[0048] 将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。\n[0049] 可选地,所述索引名称包括排序查询方式标识和分组查询方式标识;\n[0050] 在所述第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,以及数据内容为将数据条目的各个字段进行序列化后得到的内容。\n[0051] 根据本发明的又一方面,提供了一种数据查询系统,包括第一数据存储器、数据发布服务器和第二数据存储器,其中,所述数据发布服务器包括上述的数据存储系统。\n[0052] 根据本发明的上述一个或多个技术方案,通过采用离线计算代替同步计算,并整合传统关系型数据库和nosql数据库的优点,既满足了对业务数据进行复杂查询的功能要求,又解决了基于传统关系型数据库查询效率较低的问题,特别是提高了高并发环境下的数据查询效率;在离线计算中还采用并行计算技术,通过并行的方式将第一数据存储器中的数据条目及相应的索引数据写入到第二数据存储器中,大幅度提高了数据的写入速度。\n[0053] 上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。\n附图说明\n[0054] 图1示出了根据本发明一个实施例的数据查询系统的结构示意图;\n[0055] 图2示出了根据本发明一个实施例的数据存储系统的结构示意图;\n[0056] 图3示出了根据本发明一个实施例的数据存储方法的流程示意图;以及\n[0057] 图4示出了本发明实施例中数据和索引的分块并行计算示意图。\n具体实施方式\n[0058] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。\n[0059] 图1示出了根据本发明一个实施例的数据查询系统的结构示意图。参照图1,本发明实施例的数据查询系统可以包括:第一数据存储器100、数据发布服务器20和第二数据存储器300,其中数据发布服务器20分别与第一数据存储器100和第二数据存储器300通信连接,且数据发布服务器20包括数据存储系统200,即数据存储系统200驻留在数据发布服务器20中。\n[0060] 数据存储系统200能够从第一数据存储器中100获取各个数据条目,将所获取的数据条目存储到第二数据存储器300中,其中在第二数据存储器300中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容。数据存储系统200还能够根据对第一数据存储器100中的数据条目的各种查询方式构造索引列表(索引列表中的每个索引对应一种查询方式),并将该索引列表中的每个索引存储到第二数据存储器300中,其中在第二数据存储器300中,每个索引包括标识该索引的索引名称以及相关联的数据条目标识列表。\n[0061] 数据存储系统200还可以采用并行计算技术将第一数据存储器100中的数据条目存储到第二数据存储器300中,和/或,采用并行计算技术将索引列表中的各索引存储到第二数据存储器300中,如此,提高了数据和索引写入到第二数据存储器时的写入速度。\n[0062] 根据数据存储系统200的上述处理,相当于预先完成了在各种查询方式下对第一数据存储器100中数据条目的查询,并将查询结果存储在第二数据存储器300中,即采用离线计算代替了传统的同步计算。这样,当应用服务器400需要查询第一数据存储器100中的数据条目时,可以直接从第二数据存储器300提供的查询接口来获取查询结果,由于不需要根据具体的查询方式进行实时计算,因此提高了数据查询速度。具体地,所述查询接口接收到应用服务器400发来的查询请求时,先根据所述查询请求中携带的查询方式信息确定索引名称,然后根据索引名称从第二数据存储器200中获取对应的数据条目标识列表,最后根据获取到的数据条目标识列表从第二数据存储器200中获取对应的数据条目集合。\n[0063] 第一数据存储器100可以是关系型数据库,例如Oracle、DB2、Microsoft SQL Server和MySQL等;第二数据存储器200可以是键-值方式的no sql数据库,例如redis数据库。此种情况下,该数据查询系统就整合了传统关系型数据库和nosql数据库的优点,既满足了对业务数据进行复杂查询的功能要求,又解决了基于传统关系型数据库查询效率较低的问题,特别是提高了高并发环境下的数据查询效率。其中,redis是一个key-value存储系统,它支持存储的value类型包括string(字符串)、list(链表)、set(集合)、sorted set(有序集合)和hash(哈希)类型。这些数据类型都支持push/pop、add/remove及取交集、并集和差集及等操作,而且这些操作都是原子性的。\n[0064] 以下对上述数据查询系统中的数据存储系统200的具体构成和工作原理进行详细描述。\n[0065] 图2示出了根据本发明一个实施例的数据存储系统的结构示意图。该数据存储系统200可以驻留在数据发布服务器20中,所述数据发布服务器20分别与第一数据存储器100和第二数据存储器300通信连接,通过所述数据存储系统200,能够将来自第一数据存储器\n100的数据条目存储到第二数据存储器300中,从而完成数据的发布。其中,第一数据存储器\n100可以是关系型数据库,例如Oracle、DB2、Microsoft SQL Server和MySQL等;第二数据存储器200可以是键-值方式的no sql数据库,例如redis数据库。\n[0066] 参照图2,本发明实施例的数据存储系统200可以包括:索引列表构造单元210、索引存储单元220、数据条目存储单元230和关联单元240。\n[0067] 考虑到对业务数据的使用实际情况,在现实中使用的数据查询方式是有限的,因此,索引列表构造单元210可以根据对第一数据存储器100中的数据条目的各种查询方式构造索引列表,也就是说,索引列表中包括多个索引,每个索引对应一种查询方式。\n[0068] 对数据条目的查询方式一般包括排序查询方式(order by)和分组查询方式(group by),以及二者的组合。order by和group by的数量是有限的,而且大部分的order by和group by是一起使用的,因此,索引列表构造单元210可以先根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表,然后,根据排序列表和分组列表进行笛卡尔乘积,来构造所述索引列表。当然,对数据条目的查询方式也可以是现有技术中的其他查询方式,甚至是将来有可能出现的其他查询方式,本发明实施例对此不做限制。\n[0069] 索引列表构造单元210构造完成索引列表后,索引存储单元220可以在第二数据存储器300中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称以及与该索引相关联的数据条目标识列表。在具体实现时,索引存储单元220可以先将索引名称作为键(key)存储到第二存储器300中,对应的值(vlaue)暂时为空。后续,通过关联单元240确定索引名称对应的数据条目标识列表后,再将该数据条目标识列表作为值与对应的索引名称相关联的存储到第二数据存储器300中。例如,对于redis数据库,对应的值的类型可以采用有序集(sorted set),即所存储的数据条目标识列表中的数据条目标识是有序的,其顺序由索引对应的查询方式所确定。\n[0070] 在一种实现方式中,所述索引名称包括排序查询方式标识(orderID)和分组查询方式标识(groupID)。在另一种实现方式中,所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识。其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。在具体实现时,所述数据键值类型可以直接采用所述键值,也可以是对键值进行编码后的值,且本发明实施例对具体的编码方式不做限制。\n[0071] 例如,假设数据条目有4个字段,字段名称分别为A、B、C、D,用户查询的键值为{A、C},则所述数据键值类型可以是{A、C},也可以是对{A、C}进行编码后的值例如2。\n[0072] 数据条目存储单元230适于从第一数据存储器100中获取各个数据条目,将所获取的数据条目存储到第二数据存储器300中,其中在第二数据存储器300中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容。例如对于redis数据库,每个数据条目是以数据条目的唯一标识作为键,以相关联的数据内容作为值进行存储。\n[0073] 为提高数据处理速度,数据条目存储单元230可以将第一数据存储器100划分为多个数据区,并启动多个第一线程,每个第一线程负责从第一数据存储器100的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器300中,即多个第一线程并行地将第一数据存储器100中的数据条目写入到第二数据存储器300中。\n[0074] 在具体实现时,数据条目存储单元230可以先判断第一数据存储器100中存储的数据条目的数量是否大于阈值,然后根据判断结果决定是否执行多线程处理。当数据条目的数量大于阈值时,执行所述多线程处理,否则,可以不执行所述多线程处理。其中,所述阈值可以根据经验值和试验确定。\n[0075] 当所述索引名称包括排序查询方式标识和分组查询方式标识时,则在第二数据存储器300中,每个数据条目的唯一标识为该数据条目在第一数据存储器100中的唯一标识,相关联的数据内容为将数据条目的各个字段进行序列化后得到的内容。例如,当第一数据存储器100为关系型数据库时,该唯一标识可以为数据条目的主键。\n[0076] 其中,对数据条目的各个字段进行序列化是指:依次取出该数据条目的各个字段的值,将每个字段的值作为一个序列项来组合成一个序列,且各序列项之间用分隔符例如逗号进行分割;或者,依次取出该数据条目的各个字段的值,将每个字段的名称和字段的值作为一个序列项来组合成一个序列,且字段的名称和字段的值之间用分割符例如冒号分割,各序列项之间用分隔符例如逗号进行分割。\n[0077] 例如,假设数据条目有4个字段,字段名称分别为A、B、C、D,对应的字段值分别为a,b,c,d,则进行序列化后得到的内容为{a,b,c,d},或者为{A:a,B:b,C:c,D:d}。\n[0078] 当所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识时,则在第二数据存储器300中,每个数据条目的唯一标识为该数据条目在第一数据存储器100中的唯一标识,相关联的数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容。例如,当第一数据存储器100为关系型数据库时,该唯一标识可以为数据条目的主键。\n[0079] 例如,假设数据条目有4个字段,字段名称分别为A、B、C、D,对应的字段值分别为a,b,c,d,数据键值类型为{A、C},则进行序列化后得到的内容为{a,c},或者为{A:a,C:c}。\n[0080] 关联单元240适于根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器300中的唯一标识,获取与该索引相关联的数据条目标识列表。\n[0081] 每个索引对应一种查询方式,对于每种查询方式,关联单元240可以构造相应的查询语句来从第一数据存储器100中获取相对应的数据条目。例如,当所述第一数据存储器\n100为关系型数据库时,关联单元240可以根据查询方式构造SQL语句,根据构造的SQL语句对所述第一数据存储器100进行操作,从而获得与该查询方式对应的数据条目。SQL语句示例如下:\n[0082] select*from表名sort by A group by B。\n[0083] 关联单元240获取到与该索引相关联的一个或多个数据条目后,确定每个数据条目的唯一标识,例如为数据条目的主键,从而得到与该索引相关联的数据条目标识列表,然后,索引存储单元220可以将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器300中。如此,就将第二数据存储器中存储的索引与该索引对应的数据条目集合关联起来了。\n[0084] 为提高数据处理速度,关联单元240可以启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器100中确定与所负责的排序查询方式对应的排序数据条目集合;并启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。\n[0085] 为进一步提高数据处理速度,关联单元240还可以将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。在具体实现时,关联单元240可以先判断排序数据条目集合中的数据条目的数量是否大于阈值,然后根据判断结果决定是否执行多线程处理。当数据条目的数量大于阈值时,执行所述多线程处理,否则,可以不执行所述多线程处理。其中,所述阈值可以根据经验值和试验确定。\n[0086] 根据本发明实施例的数据存储系统200,通过采用离线计算代替同步计算,有效的提高了数据的查询效率。例如,可以在所述第二数据存储器300中配置查询接口,应用服务器400不需要访问第一数据存储器100进行实时计算,而是直接从查询接口来获取与查询请求对应的数据条目,如此,避免了对第一数据存储器100中数据条目的复杂的查询运算,提高了查询速度。\n[0087] 如前所述,在一种实现方式中,第二数据存储器中300存储的索引名称包括排序查询方式标识和分组查询方式标识;在另一种实现方式中,所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识。\n[0088] 对应于上述的两种实现方式,所述查询接口获取查询数据的方式也有两种。在一种实现方式中,查询接口获取数据的过程为:\n[0089] 获取来自应用服务器400的查询请求,所述查询请求包括查询方式和键值;\n[0090] 根据查询方式确定索引名称,从第二数据存储器300中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器300中获取相关联的数据内容;\n[0091] 对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器400。\n[0092] 其中,去序列化是序列化的逆过程,其具体实现过程本领域技术人员容易根据前述的序列化过程确定。\n[0093] 在另一种实现方式中,查询接口获取数据的过程为:\n[0094] 获取来自应用服务器400的查询请求,所述查询请求包括查询方式和键值;\n[0095] 根据查询方式和键值确定索引名称,从第二数据存储器300中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器300中获取相关联的数据内容;\n[0096] 对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器400。\n[0097] 两种实现方式的一个差别在于:在第一种实现方式中,去序列化后的内容是整个数据条目的内容,还需要从中获取与键值对应的内容后再返回给应用服务器;在第二种实现方式中,去序列化后的内容是数据条目中与键值对应的内容,可以直接返回给应用服务器。\n[0098] 图3示出了根据本发明一个实施例的数据存储方法的流程示意图,该数据存储方法适于将来自第一数据存储器的数据条目存储到第二数据存储器中,其中第一数据存储器可以是关系型数据库,例如Oracle、DB2、Microsoft SQL Server和MySQL等,第二数据存储器可以是键-值方式的no sql数据库,例如redis数据库。\n[0099] 参照图3,所述数据存储器方法可以包括:\n[0100] 步骤S310,根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;\n[0101] 对数据条目的查询方式一般包括排序查询方式(order by)和分组查询方式(group by),以及二者的组合。order by和group by的数量是有限的,而且大部分的order by和group by是一起使用的,因此,可以先根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表;然后,根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。当然,对数据条目的查询方式也可以是现有技术中的其他查询方式,甚至是将来有可能出现的其他查询方式,本发明实施例对此不做限制。\n[0102] 步骤S320,在第二数据存储器中存储该索引列表中的每个索引;\n[0103] 在第二数据存储器中,每个索引包括标识该索引的索引名称以及与该索引相关联的数据条目标识列表。在本步骤中,可以先将索引名称作为键(key)存储到第二存储器中,对应的值(vlaue)暂时为空。在后续的步骤中确定了索引名称对应的数据条目标识列表后,再将该数据条目标识列表作为值与对应的索引名称相关联的存储到第二存储器中。例如,对于redis数据库,对应的值的类型可以采用有序集(sorted set),即所存储的数据条目标识列表中的数据条目标识是有序的,其顺序由索引对应的查询方式所确定。\n[0104] 在一种实现方式中,所述索引名称包括排序查询方式标识(orderID)和分组查询方式标识(groupID)。在另一种实现方式中,所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识。其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。在具体实现时,所述数据键值类型可以直接采用所述键值,也可以是对键值进行编码后的值,且本发明实施例对具体的编码方式不做限制。\n[0105] 步骤S330,从第一数据存储器中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中;\n[0106] 在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容。例如对于redis数据库,每个数据条目是以数据条目的唯一标识作为键,以相关联的数据内容作为值进行存储。\n[0107] 为提高数据处理速度,可以将第一数据存储器划分为多个数据区,并启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,即多个第一线程并行地将第一数据存储器中的数据条目写入到第二数据存储器中。\n[0108] 在具体实现时,可以先判断第一数据存储器中存储的数据条目的数量是否大于阈值,然后根据判断结果决定是否执行多线程处理。当数据条目的数量大于阈值时,执行所述多线程处理,否则,可以不执行所述多线程处理。其中,所述阈值可以根据经验值和试验确定。\n[0109] 当所述索引名称包括排序查询方式标识和分组查询方式标识时,则在第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,相关联的数据内容为将数据条目的各个字段进行序列化后得到的内容。例如,当第一数据存储器为关系型数据库时,该唯一标识可以为数据条目的主键。\n[0110] 当所述索引名称包括数据键值类型、排序查询方式标识和分组查询方式标识时,则在第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,相关联的数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容。例如,当第一数据存储器为关系型数据库时,该唯一标识可以为数据条目的主键。\n[0111] 步骤S340,根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;\n[0112] 每个索引对应一种查询方式,对于每种查询方式,可以构造相应的查询语句来从第一数据存储器中获取相对应的数据条目。例如,当所述第一数据存储器为关系型数据库时,可以根据查询方式构造SQL语句,根据构造的SQL语句对所述第一数据存储器进行操作,从而获得与该查询方式对应的数据条目。\n[0113] 获取到与该索引相关联的一个或多个数据条目后,再进一步确定每个数据条目的唯一标识,例如为数据条目的主键,从而得到与该索引相关联的数据条目标识列表。\n[0114] 为提高数据处理速度,可以启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合;并启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。\n[0115] 为进一步提高数据处理速度,还可以将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。在具体实现时,可以先判断排序数据条目集合中的数据条目的数量是否大于阈值,然后根据判断结果决定是否执行多线程处理。当数据条目的数量大于阈值时,执行所述多线程处理,否则,可以不执行所述多线程处理。其中,所述阈值可以根据经验值和试验确定。\n[0116] 步骤S350,将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中,如此,就将第二数据存储器中存储的索引与该索引对应的数据条目集合关联起来了。\n[0117] 根据本发明实施例的数据存储方法,通过采用离线计算代替同步计算,有效的提高了数据的查询效率。例如,可以在所述第二数据存储器中配置查询接口,应用服务器不需要访问第一数据存储器进行实时计算,而是直接从查询接口来获取与查询请求对应的数据条目,如此,避免了对第一数据存储器中数据条目的复杂的查询运算,提高了查询速度。\n[0118] 也就是说,本发明实施例的数据存储方法还可以包括如下步骤:\n[0119] 获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值,其中所述键值为数据条目的一个或多个字段名称;\n[0120] 根据查询方式确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;\n[0121] 对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器。\n[0122] 或者,本发明实施例的数据存储方法还可以包括如下步骤:\n[0123] 获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值;\n[0124] 根据查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;\n[0125] 对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。\n[0126] 以下给出本发明的一个应用实例。\n[0127] 在该应用实例中,汽车经销商降价排行榜数据存储在传统的关系型数据库中,在该关系型数据库中存储的汽车数据条目包括如下字段名称:\n[0128] DealerId SpecId SpecName SpecImage SeriesId SeriesName BrandId FactoryId NewsId NewsType NewsTitle StartDate EndDate DTime Price \nOriginalPrice PriceOffPercent OrdersLastMonth OrdersLastQuarter CreateTime ModifyTime PID CID SID KindId NewsTemplateId serieslevel InventoryState PriceScope EquipCarId PackageName PackagePrice IsRecommend PriceW IsLastWeek[0129] 以下列举该关系型数据库中的3个数据条目:\n[0130] 数据条目1:1104632012款S53.0T Sportback~/upload/2013/7/19/l_\n201307191945189324136.jpg2734奥迪S533 79 8266471 0奥迪S5现车充足最高优惠9.46万元2013-12-3100:00:00.0002014-01-0500:00:00.0002013-12-3110:35:33.723633400 \n728000 13 1951 2013-12-31 10:55:00 2013-12-31 10:55:00110000 110100 110105 1 \n2671390 4 0 70 0 0 0 64 1\n[0131] 数据条目2:1 10771 2013款S64.0TFSI~/upload/2013/4/19/l_\n201304191833167634435.jpg2736奥迪S633 79 8266541 0奥迪S6现车充足最高优惠6.93万元2013-12-31 00:00:00.000 2014-01-0500:00:00.000 2013-12-31 10:37:\n12.510988700 1058000 7 97 12013-12-31 10:55:00 2013-12-31 10:55:00 \n110000110100 110105 1 26714295 0 100 0 0 0 99 1\n[0132] 数据条目3:1122032012款30FSI技术型~/upload/spec/12203/l_\n201207041848360214178.jpg18奥迪A6L33 9 8266413 0奥迪A6L现车充足最高优惠11.13万元2013-12-31 00:00:00.000 2014-01-0500:00:00.000 2013-12-3110:34:25.467 \n380900 432800 12 1700 5 2013-12-24 18:55:00 2013-12-3110:55:00 110000110100 \n110105 1 2671359 5 0 50 0 0 0 39 1\n[0133] 对上述降价排行榜数据进行发布的过程如下:\n[0134] (1)根据对该降价排行榜数据中数据条目的查询方式,构造排序列表(Order by)如下:\n[0135]\n[0136] 可以看出,在所构造的排序列表中,包括有8种排序查询方式。\n[0137] 构造分组列表(group by)如下\n[0138] new string[]{"BrandId","SeriesId","SpecId","PID","CID","BrandId,PID","BrandId,CID","SeriesId,PID","SeriesId,CID","SpecId,PID","SeriesLevel"}[0139] 可以看出,在所构造的分组列表中,包括有11种分组查询方式。\n[0140] 然后,对二者进行笛卡尔乘积,得到多个组合,组合数量为8*11=88,即索引列表中包括88个索引,对应88种查询方式。\n[0141] (2)将每种查询条件作为索引的key存储在redis数据库中,则key为:\n[0142] "Promotion(PriceOffPercent desc,LessPrice desc,DTime desc|SpecId,PID)"\n[0143] 对应排序查询条件:\n[0144] "PriceOffPercent desc,LessPrice desc,DTime desc"\n[0145] 对应分组查询条件:\n[0146] "SpecId,PID"\n[0147] (3)在redis数据库中以key-value方式存储数据条目的key值和value值,示例如下:\n[0148] Key:"Promotion_urn:promotion:92540000014492"\n[0149] Value:"{\"DealerId\":9254,\"SpecId\":14492,\"SpecName\":\"2013\xe6\xac\xbe1.6L\xe6\x89\x8b\xe5\x8a\xa8\xe8\x88\x92\xe9\x80\x82\xe7\x89\x88\",\"SpecImage\":\"~/upload/2013/5/15/l_201305151900310633686.jpg\",\"SeriesId\":\n145,\"SeriesName\":\"POLO\",\"SeriesLevel\":2,\"BrandId\":1,\"FactoryId\":\n58,\"NewsId\":8313674,\"NewsType\":0,\"NewsTitle\":\"POLO\xe5\xb0\x91\xe9\x87\x8f\xe7\x8e\xb0\xe8\xbd\xa6\xe6\x9c\x80\xe9\xab\x98\xe4\xbc\x98\xe6\x83\xa00.5\xe4\xb8\x87\xe5\x85\x83\",\"StartDate\":\"\\/Date(1388505600000+\n0800)\\/\",\"EndDate\":\"\\/Date(1391097600000+0800)\\/\",\"DTime\":\"\\/Date(1388643961877+0800)\\/\",\"Price\":94900,\"OriginalPrice\":99900,\"\nPriceOffPercent\":5,\"OrdersLastMonth\":1178,\"OrdersLastQuarter\":0,\"CreateTime\":\"\\/Date(1385864760000+0800)\\/\",\"ModifyTime\":\"\\/Date(1388645760000+0800)\\/\",\"PID\":210000,\"CID\":210300,\"SID\":210303,\"KindId\":1,\"NewsTemplateId\":2699366,\"InventoryState\":1,\"PriceW\":10,\"PriceScope\":10,\"EquipCarId\":0,\"PackagePrice\":0,\"IsRecommend\":0,\"IsLastWeek\":1}"\n[0150] 其中,value值是根据业务类型Promotion序列化生成,进行序列化的部分代码如下:\n[0151]\n[0152]\n[0153] (4)根据(2)中生成的key获取对应的查询方式,根据获取到的查询方式,从关系型数据库中获取与该查询方式对应的数据条目,并确定这些数据条目在redis数据库中的key,得到key列表。\n[0154] (5)将每个索引的key与对应的key列表相关联的存储到redis数据库中,实现索引与数据条目的关联,从而完成数据的发布。\n[0155] 之后,就可以向应用服务器提供用于数据查询的API接口,查询API接口的示例如下:\n[0156] List
list=Redis.Instance.GetData("\nPriceOffPercent desc,LessPrice desc,DTime desc","SpecId,PID0").ToList();\n[0157] 对应的GetData方法实现如下:\n[0158]\n[0159]\n[0160] 将上述数据存储系统上线运行后,发现经销商降价排行榜数据查询接口的tps(Transactions Per Second,事务数/秒)从原有的6714提高到了1023088,性能获得大幅度的提升。\n[0161] 以下给出本发明实施例的数据存储系统和数据存储方法对数据和索引进行分块并行计算的示例。\n[0162] 图4示出了本发明实施例中数据和索引的分块并行计算示意图。参照图4,数据和索引的分块并行计算过程如下:\n[0163] (1)对于待从第一数据存储器写入到第二数据存储器的数据条目,判断这些数据条目的数量是否大于阈值,若是,则可以将第一数据存储器划分为多个数据区(例如i个),并启动多个第一线程(例如i个),每个第一线程对应一个数据计算子任务,每个数据计算子任务负责从第一数据存储器的一个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中。如果数据条目的数量不大于阈值,则可以不对第一数据存储器进行分区,仅利用一个线程来处理全部的数据条目。当然,每个第一线程也可以对应多个数据计算子任务。\n[0164] (2)启动多个第二线程(例如为n个),每个第二线程对应一个排序索引计算子任务,每个排序索引计算子任务负责排序列表(例如有n个order by)中的一个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合。当然,每个第二线程也可以对应多个排序索引计算子任务。例如,有20个order by,则可以启动5个第二线程,每个第二线程处理4个order by。\n[0165] (3)启动多个第三线程(例如为n*m个),每个第三线程对应一个排序*分组索引计算子任务(假设有m个group by),每个排序*分组索引计算子任务负责从对应的排序数据条目集合中确定与该索引(由所对应的排序与分组的组合确定)相关联的一个或多个数据条目。当然,每个第三线程也可以对应多个排序*分组索引计算子任务。\n[0166] (4)对于每个第三线程,还可以判断其对应的排序数据条目集合中数据条目的数量是否大于阈值,若是,则可以将排序数据条目集合划分为多个数据块(例如为x个),并启动多个第四线程(例如为x个),每个第四线程负责从一个数据块中确定与该索引相关联的一个或多个数据条目。如果数据条目的数量不大于阈值,则可以不对排序数据条目集合进行分块,仅利用一个线程来处理全部的数据条目。当然,每个第四线程也可以负责多个数据块的处理。\n[0167] 根据上述的并行处理,大幅提高了数据和索引写入到第二数据存储器时的写入速度。\n[0168] 在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。\n各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。\n[0169] 在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。\n[0170] 类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。\n[0171] 本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。\n[0172] 此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。\n[0173] 本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的数据存储系统中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。\n[0174] A1、一种数据存储方法,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该方法包括:根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称;将第一数据存储器划分为多个数据区,启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容;根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;以及将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中。A2、如A1所述的数据存储方法,其中,所述根据对第一数据存储器中的数据条目的查询方式构造索引列表,包括:根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表;根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。A3、如A2所述的数据存储方法,其中,所述根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表,包括:启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合;启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。A4、如A3所述的数据存储方法,其中,所述从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,包括:将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。A5、如A2、A3或A4所述的数据存储方法,其中,所述索引名称包括排序查询方式标识和分组查询方式标识;在所述第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,以及数据内容为将数据条目的各个字段进行序列化后得到的内容。A6、如A5所述的数据存储方法,其中,所述索引名称还包括数据键值类型;在所述第二数据存储器中,每个数据条目的唯一标识还包括数据键值类型,以及数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容;其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。A7、如A5所述的数据存储方法,其中,还包括:获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值,其中所述键值为数据条目的一个或多个字段名称;根据查询方式确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器。A8、如A6所述的数据存储方法,其中,还包括:获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值;根据查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。\n[0175] A9、如A1所述的数据存储方法,其中,第一数据存储器中的数据条目以关系型数据库方式进行存储;以及第二数据存储器中的索引以索引名称为键、以相关联的数据条目标识列表为值的键-值方式进行存储,以及数据条目以数据条目的唯一标识为键、以相关联的数据内容为值的键-值方式进行存储。B1、一种数据存储系统,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该系统包括:索引列表构造单元,适于根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;索引存储单元,适于在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称;数据条目存储单元,适于将第一数据存储器划分为多个数据区,启动多个第一线程,每个第一线程负责从第一数据存储器的一个或多个数据区中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容;以及关联单元,适于根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;其中,所述索引存储单元被配置成将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中。B2、如B1所述的数据存储系统,其中,所述索引列表构造单元被配置成:根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表;根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。B3、如权利要求B2所述的数据存储系统,其中,所述关联单元被配置成:启动多个第二线程,每个第二线程负责排序列表中的一个或多个排序查询方式,从第一数据存储器中确定与所负责的排序查询方式对应的排序数据条目集合;启动多个第三线程,每个第三线程负责索引列表中的一个或多个索引,从与所负责的索引对应的排序数据条目集合中确定与该索引相关联的一个或多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表。B4、如权利要求B3所述的数据存储系统,其中,所述关联单元被配置成:将排序数据条目集合划分为多个数据块,启动多个第四线程,每个第四线程负责从一个或多个数据块中确定与该索引相关联的一个或多个数据条目。B5、如权利要求B2、B3或B4所述的数据存储系统,其中,所述索引名称包括排序查询方式标识和分组查询方式标识;在所述第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识,以及数据内容为将数据条目的各个字段进行序列化后得到的内容。\nB6、如权利要求B5所述的数据存储系统,其中,所述索引名称还包括数据键值类型;在所述第二数据存储器中,每个数据条目的唯一标识还包括数据键值类型,以及数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容;其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。B7、如权利要求B5所述的数据存储系统,其中,所述第二数据存储器还包括查询接口,所述查询接口被配置成:\n获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值,其中所述键值为数据条目的一个或多个字段名称;根据查询方式确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器。B8、如权利要求B6所述的数据存储系统,其中,所述第二数据存储器还包括查询接口,所述查询接口被配置成:获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值;根据查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。B9、如权利要求B1所述的数据存储系统,其中,第一数据存储器中的数据条目以关系型数据库方式进行存储;以及第二数据存储器中的索引以索引名称为键、以相关联的数据条目标识列表为值的键-值方式进行存储,以及数据条目以数据条目的唯一标识为键、以相关联的数据内容为值的键-值方式进行存储。C1、一种数据查询系统,包括第一数据存储器、数据发布服务器和第二数据存储器,其中,所述数据发布服务器包括如B1至B9中任一项所述的数据存储系统。