一种数据存储系统和存储方法
【专利摘要】本发明公开了一种数据存储系统和存储方法,属于数据库处理【技术领域】。该方法包括:根据对第一数据存储器中的数据条目的查询方式构造索引列表;根据当前时间戳生成数据版本号;在第二数据存储器中存储索引列表中的每个索引;从第一数据存储器中获取各个数据条目存储到第二数据存储器中;根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,获取与该索引相关联的数据条目标识列表;将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中;将当前活动的数据版本号更新为所生成的数据版本号。本发明能够提高对业务数据的查询效率,并能够基于时间定时更新数据,从而向应用服务器提供较新的数据。
【专利说明】一种数据存储系统和存储方法
【技术领域】
[0001]本发明属于数据库处理【技术领域】,具体涉及一种数据存储系统和存储方法。
【背景技术】
[0002]传统的数据存储和访问的实现方式一般是基于关系型数据库或者是基于nosql数据库的分布式缓存。对于关系型数据库实现方式,数据存储在关系型数据库的磁盘中,应用程序通过sql语句访问数据库中的数据。由于sql语句的语法非常灵活,因此能够支持多种排序和多种分组条件下的复杂查询,即能够支持复杂的查询业务。但是,关系型数据库需要维护数据一致性,并维护大量关联关系,并且数据存储在硬盘上,导致数据查询速度慢,特别是在高并发访问情况下会严重影响查询效率。
[0003]对于nosql数据库实现方式,数据以键-值(key-value)对的方式存储在内存中。在这种实现方式下,由于数据存储在内存中,访问速度快,并且通过标准api(应用程序编程接口)获取数据简单易用。但这种实现方式无法很好的支持多种排序和多种组合条件的复杂查询,无法支持复杂的查询业务。
[0004]可见上述两种数据存储和访问的实现方式各有优劣。而如何在支持复杂的查询业务的前提下提高数据访问效率,就成为亟待解决的技术问题。
【发明内容】
[0005]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的数据存储系统和存储方法。
[0006]根据本发明的一个方面,提供了一种数据存储方法,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该方法包括:
[0007]根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;
[0008]根据当前时间戳生成数据版本号;
[0009]在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称,所述索引名称包括所生成的数据版本号;
[0010]从第一数据存储器中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容,所述数据条目的唯一标识包括所生成的数据版本号;
[0011]根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;
[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]可选地,所述第二数据存储器还包括查询接口,所述查询接口被配置成:
[0053]获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值;
[0054]获取当前活动的数据版本号,根据当前活动的数据版本号、查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;
[0055]对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。[0056]可选地,第一数据存储器中的数据条目以关系型数据库方式进行存储;以及
[0057]第二数据存储器中的索引以索引名称为键、以相关联的数据条目标识列表为值的键-值方式进行存储,以及数据条目以数据条目的唯一标识为键、以相关联的数据内容为值的键-值方式进行存储。
[0058]可选地,所述系统还包括老化单元,适于在数据的老化时间到达时,从第二数据存储器中删除相应版本的索引和数据条目。
[0059]根据本发明的又一方面,提供了一种数据查询系统,包括第一数据存储器、数据发布服务器和第二数据存储器,其中,所述数据发布服务器包括上述的数据存储系统。
[0060]根据本发明的上述一个或多个技术方案,通过采用离线计算代替同步计算,并整合传统关系型数据库和nosql数据库的优点,既满足了对业务数据进行复杂查询的功能要求,又解决了基于传统关系型数据库查询效率较低的问题,特别是提高了高并发环境下的数据查询效率;通过数据版本号管理,能够基于时间定时更新数据,从而向应用服务器提供较新的数据。
[0061]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【专利附图】
【附图说明】
[0062]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0063]图1示出了根据本发明一个实施例的数据查询系统的结构示意图;
[0064]图2示出了根据本发明一个实施例的数据存储系统的结构示意图;以及
[0065]图3示出了根据本发明一个实施例的数据存储方法的流程示意图。
【具体实施方式】
[0066]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0067]图1示出了根据本发明一个实施例的数据查询系统的结构示意图。参照图1,本发明实施例的数据查询系统可以包括:第一数据存储器100、数据发布服务器20和第二数据存储器300,其中数据发布服务器20分别与第一数据存储器100和第二数据存储器300通信连接,且数据发布服务器20包括数据存储系统200,即数据存储系统200驻留在数据发布服务器20中。
[0068]数据存储系统200能够从第一数据存储器中100获取各个数据条目,将所获取的数据条目存储到第二数据存储器300中,其中在第二数据存储器300中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容,且所述数据条目的唯一标识包括数据版本号(version)。数据存储系统200还能够根据对第一数据存储器100中的数据条目的各种查询方式构造索引列表(索引列表中的每个索引对应一种查询方式),并将该索引列表中的每个索引存储到第二数据存储器300中,其中在第二数据存储器300中,每个索引包括标识该索引的索引名称以及相关联的数据条目标识列表,且所述索引名称包括数据版本号。
[0069]根据数据存储系统200的上述处理,相当于预先完成了在各种查询方式下对第一数据存储器100中数据条目的查询,并将查询结果存储在第二数据存储器300中,即采用离线计算代替了传统的同步计算。这样,当应用服务器400需要查询第一数据存储器100中的数据条目时,可以直接从第二数据存储器300提供的查询接口来获取查询结果,由于不需要根据具体的查询方式进行实时计算,因此提高了数据查询速度。具体地,所述查询接口接收到应用服务器400发来的查询请求时,先获取当前活动的数据版本号,并根据当前活动的数据版本号和所述查询请求中携带的查询方式信息确定索引名称,然后根据索引名称从第二数据存储器200中获取对应的数据条目标识列表,最后根据获取到的数据条目标识列表从第二数据存储器200中获取对应的数据条目集合。通过数据版本号管理,能够基于时间定时更新数据,从而向应用服务器提供较新的数据。
[0070]第一数据存储器100可以是关系型数据库,例如Oracle、DB2、Microsoft SQLServer和MySQL等;第二数据存储器200可以是键-值方式的no sql数据库,例如redis数据库。此种情况下,该数据查询系统就整合了传统关系型数据库和nosql数据库的优点,既满足了对业务数据进行复杂查询的功能要求,又解决了基于传统关系型数据库查询效率较低的问题,特别是提高了高并发环境下的数据查询效率。其中,redis是一个key-value存储系统,它支持存储的value类型包括string (字符串)、list (链表)、set (集合)、sortedset (有序集合)和hash (哈希)类型。这些数据类型都支持push/pop、add/remove及取交集、并集和差集及等操作,而且这些操作都是原子性的。
[0071]以下对上述数据查询系统中的数据存储系统200的具体构成和工作原理进行详细描述。
[0072]图2示出了根据本发明一个实施例的数据存储系统的结构示意图。该数据存储系统200可以驻留在数据发布服务器20中,所述数据发布服务器20分别与第一数据存储器100和第二数据存储器300通信连接,通过所述数据存储系统200,能够将来自第一数据存储器100的数据条目存储到第二数据存储器300中,从而完成数据的发布。其中,第一数据存储器100可以是关系型数据库,例如Oracle、DB2、Microsoft SQL Server和MySQL等;第二数据存储器200可以是键-值方式的no sql数据库,例如redis数据库。
[0073]参照图2,本发明实施例的数据存储系统200可以包括:索引列表构造单元210、索引存储单元220、数据条目存储单元230、关联单元240和版本号管理单元250。
[0074]考虑到对业务数据的使用实际情况,在现实中使用的数据查询方式是有限的,因此,索引列表构造单元210可以根据对第一数据存储器100中的数据条目的各种查询方式构造索引列表,也就是说,索引列表中包括多个索引,每个索引对应一种查询方式。
[0075]对数据条目的查询方式一般包括排序查询方式(order by)和分组查询方式(group by),以及二者的组合。order by和group by的数量是有限的,而且大部分的orderby和group by是一起使用的,因此,索引列表构造单元210可以先根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表,然后,根据排序列表和分组列表进行笛卡尔乘积,来构造所述索引列表。当然,对数据条目的查询方式也可以是现有技术中的其他查询方式,甚至是将来有可能出现的其他查询方式,本发明实施例对此不做限制。
[0076]在将第一数据存储器100中的数据条目及索引存储到第二数据存储器300之前,版本号管理单元250可以根据当前时间戳生成数据版本号。
[0077]之后,索引存储单元220可以在第二数据存储器300中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称以及与该索引相关联的数据条目标识列表,且所述索引名称包括所生成的数据版本号。在具体实现时,索引存储单元220可以先将索引名称作为键(key)存储到第二存储器300中,对应的值(vlaue)暂时为空。后续,通过关联单元240确定索引名称对应的数据条目标识列表后,再将该数据条目标识列表作为值与对应的索引名称相关联的存储到第二数据存储器300中。例如,对于redis数据库,对应的值的类型可以采用有序集(sorted set),即所存储的数据条目标识列表中的数据条目标识是有序的,其顺序由索引对应的查询方式所确定。
[0078]在一种实现方式中,所述索引名称包括数据版本号、排序查询方式标识(orderID)和分组查询方式标识(groupID)。在另一种实现方式中,所述索引名称包括数据键值类型、数据版本号、排序查询方式标识和分组查询方式标识。其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。在具体实现时,所述数据键值类型可以直接采用所述键值,也可以是对键值进行编码后的值,且本发明实施例对具体的编码方式不做限制。
[0079]例如,假设数据条目有4个字段,字段名称分别为A、B、C、D,用户查询的键值为{A、C},则所述数据键值类型可以是{A、C},也可以是对{A、C}进行编码后的值例如2。
[0080]数据条目存储单元230适于从第一数据存储器100中获取各个数据条目,将所获取的数据条目存储到第二数据存储器300中,其中在第二数据存储器300中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容,所述数据条目的唯一标识包括所生成的数据版本号。例如对于redis数据库,每个数据条目是以数据条目的唯一标识作为键,以相关联的数据内容作为值进行存储。
[0081]当所述索引名称包括数据版本号、排序查询方式标识和分组查询方式标识时,则在第二数据存储器300中,每个数据条目的唯一标识为数据版本号和该数据条目在第一数据存储器100中的唯一标识,相关联的数据内容为将数据条目的各个字段进行序列化后得到的内容。例如,当第一数据存储器100为关系型数据库时,该唯一标识可以为数据条目的主键。
[0082]其中,对数据条目的各个字段进行序列化是指:依次取出该数据条目的各个字段的值,将每个字段的值作为一个序列项来组合成一个序列,且各序列项之间用分隔符例如逗号进行分割;或者,依次取出该数据条目的各个字段的值,将每个字段的名称和字段的值作为一个序列项来组合成一个序列,且字段的名称和字段的值之间用分割符例如冒号分害I],各序列项之间用分隔符例如逗号进行分割。
[0083]例如,假设数据条目有4个字段,字段名称分别为A、B、C、D,对应的字段值分别为a, b, c, d,则进行序列化后得到的内容为{a, b, c, d},或者为{A:a, B:b, C:c, D:d}。
[0084]当所述索引名称包括数据键值类型、数据版本号、排序查询方式标识和分组查询方式标识时,则在第二数据存储器300中,每个数据条目的唯一标识为数据版本号和该数据条目在第一数据存储器100中的唯一标识,相关联的数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容。例如,当第一数据存储器100为关系型数据库时,该唯一标识可以为数据条目的主键。
[0085]例如,假设数据条目有4个字段,字段名称分别为A、B、C、D,对应的字段值分别为
a,b,c,d,数据键值类型为{A、C},则进行序列化后得到的内容为{a,c},或者为{A:a,C:c}。
[0086]关联单元240适于根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器300中的唯一标识,获取与该索引相关联的数据条目标识列表。
[0087]每个索引对应一种查询方式,对于每种查询方式,关联单元240可以构造相应的查询语句来从第一数据存储器100中获取相对应的数据条目。例如,当所述第一数据存储器100为关系型数据库时,关联单元240可以根据查询方式构造SQL语句,根据构造的SQL语句对所述第一数据存储器100进行操作,从而获得与该查询方式对应的数据条目。SQL语句示例如下:
[0088]select*from 表名 sort by A group by B。
[0089]关联单元240获取到与该索引相关联的一个或多个数据条目后,确定每个数据条目的唯一标识,例如为数据条目的数据版本号和主键,从而得到与该索引相关联的数据条目标识列表,然后,索引存储单元220可以将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器300中。如此,就将第二数据存储器中存储的索引与该索引对应的数据条目集合关联起来了。
[0090]在对第二数据存储器300的数据写入完成后,版本号管理单元250还将当前活动的数据版本号更新为所生成的数据版本号。
[0091]通过数据版本号管理,能够基于时间定时更新数据,从而向应用服务器400提供较新的数据。并且,当更新数据失败时,还能够将当前活动的数据内容恢复到以前的版本。
[0092]根据本发明实施例的数据存储系统200,通过采用离线计算代替同步计算,有效的提高了数据的查询效率。例如,可以在所述第二数据存储器300中配置查询接口,应用服务器400不需要访问第一数据存储器100进行实时计算,而是直接从查询接口来获取与查询请求对应的数据条目,如此,避免了对第一数据存储器100中数据条目的复杂的查询运算,提高了查询速度。
[0093]如前所述,在一种实现方式中,第二数据存储器中300存储的索引名称包括数据版本号、排序查询方式标识和分组查询方式标识;在另一种实现方式中,所述索引名称包括数据键值类型、数据版本号、排序查询方式标识和分组查询方式标识。
[0094]对应于上述的两种实现方式,所述查询接口获取查询数据的方式也有两种。在一种实现方式中,查询接口获取数据的过程为:
[0095]获取来自应用服务器400的查询请求,所述查询请求包括查询方式和键值;
[0096]获取当前活动的数据版本号,根据当前活动的数据版本号和查询方式确定索引名称,从第二数据存储器300中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器300中获取相关联的数据内容;
[0097]对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器400。
[0098]其中,去序列化是序列化的逆过程,其具体实现过程本领域技术人员容易根据前述的序列化过程确定。
[0099]在另一种实现方式中,查询接口获取数据的过程为:
[0100]获取来自应用服务器400的查询请求,所述查询请求包括查询方式和键值;
[0101]获取当前活动的数据版本号,根据当前活动的数据版本号、查询方式和键值确定索引名称,从第二数据存储器300中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器300中获取相关联的数据内容;
[0102]对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器400。
[0103]两种实现方式的一个差别在于:在第一种实现方式中,去序列化后的内容是整个数据条目的内容,还需要从中获取与键值对应的内容后再返回给应用服务器;在第二种实现方式中,去序列化后的内容是数据条目中与键值对应的内容,可以直接返回给应用服务器。
[0104]可选地,所述数据存储系统中还包括老化单元(图未示),适于在数据的老化时间到达时,从第二数据存储器中删除相应版本的索引和数据条目。可以为每个版本设置一个老化时间(过期时间),例如,设置该老化时间为6天,并在当前版本生效后的预定时间(比如每40分钟一次)开始生成下一版本数据。
[0105]图3示出了根据本发明一个实施例的数据存储方法的流程示意图,该数据存储方法适于将来自第一数据存储器的数据条目存储到第二数据存储器中,其中第一数据存储器可以是关系型数据库,例如0racle、DB2、Microsoft SQL Server和MySQL等,第二数据存储器可以是键-值方式的no sql数据库,例如redis数据库。
[0106]参照图3,所述数据存储器方法可以包括:
[0107]步骤S310,根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式;
[0108]对数据条目的查询方式一般包括排序查询方式(order by)和分组查询方式(group by),以及二者的组合。order by和group by的数量是有限的,而且大部分的orderby和group by是一起使用的,因此,可以先根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表;然后,根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。当然,对数据条目的查询方式也可以是现有技术中的其他查询方式,甚至是将来有可能出现的其他查询方式,本发明实施例对此不做限制。
[0109]步骤S320,根据当前时间戳生成数据版本号;
[0110]步骤S330,在第二数据存储器中存储该索引列表中的每个索引;
[0111]在第二数据存储器中,每个索引包括标识该索引的索引名称以及与该索引相关联的数据条目标识列表,所述索引名称包括所生成的数据版本号。在本步骤中,可以先将索引名称作为键(key)存储到第二存储器中,对应的值(vlaue)暂时为空。在后续的步骤中确定了索引名称对应的数据条目标识列表后,再将该数据条目标识列表作为值与对应的索引名称相关联的存储到第二存储器中。例如,对于redis数据库,对应的值的类型可以采用有序集(sorted set),即所存储的数据条目标识列表中的数据条目标识是有序的,其顺序由索弓I对应的查询方式所确定。[0112]在一种实现方式中,所述索引名称包括数据版本号、排序查询方式标识(orderID)和分组查询方式标识(groupID)。在另一种实现方式中,所述索引名称包括数据键值类型、数据版本号、排序查询方式标识和分组查询方式标识。其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。在具体实现时,所述数据键值类型可以直接采用所述键值,也可以是对键值进行编码后的值,且本发明实施例对具体的编码方式不做限制。
[0113]步骤S340,从第一数据存储器中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中;
[0114]在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容,且所述数据条目的唯一标识包括所生成的数据版本号。例如对于redis数据库,每个数据条目是以数据条目的唯一标识作为键,以相关联的数据内容作为值进行存储。
[0115]当所述索引名称包括数据版本号、排序查询方式标识和分组查询方式标识时,则在第二数据存储器中,每个数据条目的唯一标识为数据版本号和该数据条目在第一数据存储器中的唯一标识,相关联的数据内容为将数据条目的各个字段进行序列化后得到的内容。例如,当第一数据存储器为关系型数据库时,该唯一标识可以为数据条目的主键。
[0116]当所述索引名称包括数据键值类型、数据版本号、排序查询方式标识和分组查询方式标识时,则在第二数据存储器中,每个数据条目的唯一标识为数据版本号和该数据条目在第一数据存储器中的唯一标识,相关联的数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容。例如,当第一数据存储器为关系型数据库时,该唯一标识可以为数据条目的主键。
[0117]步骤S350,根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表;
[0118]每个索引对应一种查询方式,对于每种查询方式,可以构造相应的查询语句来从第一数据存储器中获取相对应的数据条目。例如,当所述第一数据存储器为关系型数据库时,可以根据查询方式构造SQL语句,根据构造的SQL语句对所述第一数据存储器进行操作,从而获得与该查询方式对应的数据条目。
[0119]获取到与该索引相关联的一个或多个数据条目后,再进一步确定每个数据条目的唯一标识,例如为数据版本号和数据条目的主键,从而得到与该索引相关联的数据条目标识列表。
[0120]步骤S360,将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中,如此,就将第二数据存储器中存储的索引与该索引对应的数据条目集合关联起来了;
[0121]步骤S370,在对第二数据存储器的数据写入完成后,将所生成的数据版本号存储为当前活动的数据版本号。
[0122]根据本发明实施例的数据存储方法,通过采用离线计算代替同步计算,有效的提高了数据的查询效率。例如,可以在所述第二数据存储器中配置查询接口,应用服务器不需要访问第一数据存储器进行实时计算,而是直接从查询接口来获取与查询请求对应的数据条目,如此,避免了对第一数据存储器中数据条目的复杂的查询运算,提高了查询速度。[0123]也就是说,本发明实施例的数据存储方法还可以包括如下步骤:
[0124]获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值,其中所述键值为数据条目的一个或多个字段名称;
[0125]获取当前活动的数据版本号,根据当前活动的数据版本号和查询方式确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;
[0126]对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器。
[0127]或者,本发明实施例的数据存储方法还可以包括如下步骤:
[0128]获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值;
[0129]获取当前活动的数据版本号,根据当前活动的数据版本号、查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容;
[0130]对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。
[0131]可选地,所述数据存储方法还包括:在数据的老化时间到达时,从第二数据存储器中删除相应版本的索引和数据条目。可以为每个版本设置一个老化时间(过期时间),例如,设置该老化时间为6天,并在当前版本生效后的预定时间(比如每40分钟一次)开始生成下一版本数据。
[0132]通过数据版本号管理,能够基于时间定时更新数据,从而向应用服务器提供较新的数据。并且,当更新数据失败时,还能够将当前活动的数据内容恢复到以前的版本。
[0133]以下给出本发明的一个应用实例。
[0134]在该应用实例中,汽车经销商降价排行榜数据存储在传统的关系型数据库中,在该关系型数据库中存储的汽车数据条目包括如下字段名称:
[0135]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
[0136]以下列举该关系型数据库中的3个数据条目:
[0137]数据条目1:1104632012 款 S53.0T Sportback ?/upload/2013/7/19/1_201307191945189324136.jpg2734 奥迪 S5337982664710 奥迪 S5 现车充足最高优惠9.46 万元 2013-12-3100:00:00.0002014-01-0500:00:00.0002013-12-3110:35:33.7236334007280001319512013-12-3110:55:002013-12-3110:55:00110000110100110105126713904070000641
[0138]数据条目2:1107712013 款 S64.0TFSI ?/upload/2013/4/19/1_201304191833167634435.jpg2736 奥迪 S6337982665410 奥迪 S6 现车充足最高优惠
6.93 万元 2013-12-3100:00:00.0002014-01-0500:00:00.0002013-12-3110:37:12.510988700105800079712013-12-3110:55:002013-12-3110:55:001100001101001101051267142950100000991[0139]数据条目3:1122032012 款 30FSI 技术型~/upload/spec/12203/1—201207041848360214178.jpgl8 奥迪 A6L33982664130 奥迪 A6L 现车充足最高优惠 11.13万元 2013-12-3100:00:00.0002014-01-0500:00:00.0002013-12-3110:34:25.46738090043280012170052013-12-2418:55:002013-12-3110:55:00110000110100110105126713595050000391
[0140]对上述降价排行榜数据进行发布的过程如下:
[0141](I)根据对该降价排行榜数据中数据条目的查询方式,构造排序列表(Order by)如下:
[0142]new string口 {〃PriceOffPercent desc,LessPrice desc,DTime desc〃,
[0143]^OrdersLastMonth desc, Price desc, DTime desc'
[0144]"DTime desc, Price asc",
[0145]"Price desc, DTime desc'
[0146]"Price asc,DTime desc",
[0147]^OrdersLastQuarter desc, DTime desc",
[0148]^OrdersLastMonth desc,PriceOffPercent desc,LessPrice desc, DTime desc〃,
[0149]^PriceOffPercent desc, OrdersLastMonth desc,Price asc,DTime desc"}
[0150]可以看出,在所构造的排序列表中,包括有8种排序查询方式。
[0151]构造分组列表(group by)如下
[0152]new string[] {"Brandld", "Seriesld", "Specld", "PID", "CID", "Brandld, PID",〃BrandId, CID〃, 〃SeriesId, PID〃, 〃SeriesId, CID〃, 〃SpecId, PID〃, 〃SeriesLevel〃}
[0153]可以看出,在所构造的分组列表中,包括有11种分组查询方式。
[0154]然后,对二者进行笛卡尔乘积,得到多个组合,组合数量为8*11=88,即索引列表中包括88个索引,对应88种查询方式。
[0155](2)将每种查询条件作为索引的key存储在redis数据库中,则key为:
[0156]"Dealer_I(635243523064539979)Promotion(PriceOffPercent desc, LessPricedesc, DTime desc|Specld, PID)"
[0157]其中,635243523064539979为时间戳,即数据版本号。
[0158]对应排序查询条件:
[0159]"PriceOffPercent desc, LessPrice desc, DTime desc"
[0160]对应分组查询条件:
[0161]〃SpecId, PID"
[0162](3)在redis数据库中以key-value方式存储数据条目的key值和value值,示例如下:
[0163]Key: 〃Dealer_D (635243523064539979) Promotion —urn: promotion:92540000014492"
[0164]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\x88\", \"SpecImage\":\〃 ~/upload/2013/5/15/l_201305151900310633686.jpg\", \"Seriesld\〃:145,\〃SeriesName\〃:\〃P0L0\〃,\〃SeriesLevel\〃:2,\〃BrandId\〃:1,\〃Factoryld\":58, \"NewsId\":8313674, \"NewsType\":0, \〃NewsTitle\〃:\"POLO\xe5\xbO\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\", \"StartDat e\〃:\"\/Date (1388505600000+0800) \/\",\〃EndDate\〃: \"\/Date (1391097600000+0800) \/\",\"DTime\": \"\/Date (1388643961877+0800)\/\〃,\〃Price\〃:94900,\〃OriginalPrice\〃:99900,\〃PriceO ffPercent\〃:5, \〃OrdersLastMonth\〃: 1178, \〃OrdersLastQuarter\〃:0,\〃CreateTime\〃:\"\/Date (1385864760000+0800)\/\",\"ModifyTime\":\"\/Date(1388645760000+0800) \/\",\"PID\":210000, \"CID\": 210300,\"SID\": 210303,\"KindId\": 1,\"NewsTemplateld\":2699366, X^InventoryStat e\〃:1,\"PriceW\":10, \"PriceScope\":10, \"EquipCarId\〃:0,\〃PackagePrice\〃:0,\〃IsRecommend\〃:0,\〃IsLastWeek\〃:1}〃
[0165]其中,635243523064539979为时间戳,即数据版本号,value值是根据业务类型Promotion序列化生成,进行序列化的部分代码如下:
[0166]
【权利要求】
1.一种数据存储方法,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该方法包括: 根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式; 根据当前时间戳生成数据版本号; 在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称,所述索引名称包括所生成的数据版本号; 从第一数据存储器中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容,所述数据条目的唯一标识包括所生成的数据版本号; 根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表; 将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中;以及 在对第二数据存储器的数据写入完成后,将当前活动的数据版本号更新为所生成的数据版本号。
2.如权利要求1所述的数据存储方法,其中,所述根据对第一数据存储器中的数据条目的查询方式构造索引列表, 包括: 根据对数据条目的排序查询方式建立排序列表,并根据对数据条目的分组查询方式建立分组列表; 根据排序列表和分组列表进行笛卡尔乘积,构造所述索引列表。
3.如权利要求2所述的数据存储方法,其中,所述索引名称还包括排序查询方式标识和分组查询方式标识; 在所述第二数据存储器中,每个数据条目的唯一标识为该数据条目在第一数据存储器中的唯一标识和所生成的数据版本号,以及数据内容为将数据条目的各个字段进行序列化后得到的内容。
4.如权利要求3所述的数据存储方法,其中,所述索引名称还包括数据键值类型; 在所述第二数据存储器中,每个数据条目的唯一标识还包括数据键值类型,以及数据内容为将数据条目的与数据键值类型对应的各个字段进行序列化后得到的内容; 其中,所述数据键值类型用于标识键值信息,所述键值为数据条目的一个或多个字段名称。
5.如权利要求3所述的数据存储方法,其中,还包括: 获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值,其中所述键值为数据条目的一个或多个字段名称; 获取当前活动的数据版本号,根据当前活动的数据版本号和查询方式确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容; 对获取到的数据内容进行去序列化,并从去序列化后的内容中获取与键值对应的内容返回给应用服务器。
6.如权利要求4所述的数据存储方法,其中,还包括: 获取来自应用服务器的查询请求,所述查询请求包括查询方式和键值; 获取当前活动的数据版本号,根据当前活动的数据版本号、查询方式和键值确定索引名称,从第二数据存储器中查找与索引名称相关联的数据条目标识列表,并根据查找到的数据条目标识列表从第二数据存储器中获取相关联的数据内容; 对获取到的数据内容进行去序列化,将去序列化后的内容返回给应用服务器。
7.如权利要求1所述的数据存储方法,其中,第一数据存储器中的数据条目以关系型数据库方式进行存储;以及 第二数据存储器中的索引以索引名称为键、以相关联的数据条目标识列表为值的键-值方式进行存储,以及数据条目以数据条目的唯一标识为键、以相关联的数据内容为值的键-值方式进行存储。
8.如权利要求1所述的数据存储方法,其中,还包括:在数据的老化时间到达时,从第二数据存储器中删除相应版本的索引和数据条目。
9.一种数据存储系统,适于将来自第一数据存储器的数据条目存储到第二数据存储器中,该系统包括: 索引列表构造单元, 适于根据对第一数据存储器中的数据条目的查询方式构造索引列表,索引列表中的每个索引对应一种查询方式; 版本号管理单元,适于根据当前时间戳生成数据版本号,并在对第二数据存储器的数据写入完成后,将当前活动的数据版本号更新为所生成的数据版本号; 索引存储单元,适于在第二数据存储器中存储该索引列表中的每个索引,其中每个索引包括标识该索引的索引名称,所述索引名称包括所生成的数据版本号; 数据条目存储单元,适于从第一数据存储器中获取各个数据条目,将所获取的数据条目存储到第二数据存储器中,其中在第二数据存储器中,每个数据条目包括数据条目的唯一标识以及相关联的数据内容,所述数据条目的唯一标识包括所生成的数据版本号;以及 关联单元,适于根据与每个索引相对应的查询方式确定相关联的一个或者多个数据条目,并确定各数据条目在第二数据存储器中的唯一标识,获取与该索引相关联的数据条目标识列表; 其中,所述索引存储单元被配置成将与每个索引相关联的数据条目标识列表与每个索引的索引名称相关联地存储到第二数据存储器中。
10.一种数据查询系统,包括第一数据存储器、数据发布服务器和第二数据存储器,其中,所述数据发布服务器包括如权利要求9所述的数据存储系统。
【文档编号】G06F17/30GK103902698SQ201410125753
【公开日】2014年7月2日 申请日期:2014年3月31日 优先权日:2014年3月31日
【发明者】韩明 申请人:北京车商汇软件有限公司