具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在本申请实施例中,当用户数量较少时,服务器可以将所有用户的用户历史数据按照生成时间的顺序,存储在一张数据表中。一般的,一张数据表中可以以存储上千万条用户历史数据。
但是,用户数量以及各用户的用户历史数据可能会不断地增加,导致一张数据表无法容纳全部用户的用户历史数据,则需要增加用于存储用户历史数据的数据表的数量(张数),且存储用户历史数据的各张数据表还可能位于不同的数据库中,在这种情况下,会产生背景技术中提及的问题。
为了解决这个问题,可以采用本申请提供的数据拆分存储方法,对各数据表中的用户历史数据进行拆分并存储,使各用户标识对应的历史数据重新分布在在多张数据表中,以提高查询效率。下面进行详细说明。
图1为本申请实施例提供的数据拆分存储方法的过程,具体包括以下步骤:
S101:获取选定的用户历史数据。
本申请实施例提供的数据处理的方法的执行主体可以是服务器,所述服务器包括但不限于:用作服务器的个人计算机、大中型计算机、计算机集群等。为了便于描述,本申请均以所述执行主体为服务器进行说明。
在现有技术中,全部的用户历史数据一般是根据各用户历史数据的生成时间,顺序存储在至少一张数据表中。本申请中所述的选定的用户历史数据可以是全部的用户历史数据,也可以是全部的用户历史数据中的一部分用户历史数据,可以在所述至少一张数据表中,读取获得选定的用户历史数据。
本申请对实施所述数据拆分存储方法所针对的用户历史数据的数量并不做限定。
S102:在所述选定的用户历史数据中,分别确定每个用户标识对应的用户历史数据的数据量。
在本申请实施例中,所述用户标识可以是由服务器提供服务的任一用户的用户标识(Identity,ID),其中,所述用户标识具体可以是数字串、或包含数字串和其他字符的字符串,等等。该用户标识对应的用户历史数据具体可以包括:包含有该用户标识的用户历史数据。
用户标识对应的用户历史数据的数据量可以由服务器计算,或者,也可以由存储所述选定的用户历史数据的数据库计算,然后,服务器通过访问数据库,以确定数据库计算出的所述数据量。
在本申请实施例中,用户历史数据的数据量(以下可以简称为数据量)可以是:所述用户历史数据在设定时段的平均数据量。进一步的,所述用户历史数据在设定时段的平均数据量具体可以是:所述用户历史数据的每月平均条数,或者所述用户历史数据的每季度平均条数,或者所述用户历史数据的每周平均条数,或者所述用户历史数据的每日平均条数,等等。为了便于描述,以下均以用户历史数据的数据量是所述用户历史数据的每月平均条数为例进行说明。
假定某个用户标识注册时长为半年,在这半年里服务器一共为该用户标识生成了12000条用户历史数据,则可以计算得出该用户历史数据的数据量为:12000条/6个月=2000条/月。
数据量可以反映对应的用户标识(可以代表用户)与服务器进行业务交互的活跃程度(也可以称为:用户标识的活跃程度)。对于数据量越高的用户标识,可以推测随着该用户标识注册时长的增加,服务器生成的该用户标识对应的用户历史数据的总数量的增长幅度可能越高,也即,未来可能需要越多的存储空间存储该用户标识对应的用户历史数据。
另外,需要说明的是,在实际应用中,可能会存在这样的情况:某用户标识注册时长可能较长(假定为3年),其中,在注册后的前两年内,该用户标识的活跃程度很低,相应地该用户标识对应的这两年内的用户历史数据可能很少,而在注册后的第三年内,该用户标识的活跃程度很高,相应地该用户标识对应的第三年内的用户历史数据可能很多。对于这种情况下,也可以基于距离当前时间较近的时间段内(如所述第三年内)的、该用户标识对应的用户历史数据,而不是基于全部的、该用户标识对应的用户历史数据,计算数据量。这样计算出的数据量可能更能反映当前该用户标识的实际活跃程度。
S103:根据确定出的每个用户标识对应的用户历史数据的数据量,对所述选定的用户历史数据进行拆分并存储。
在本申请实施例中,可以通过确定每个用户标识对应的用户历史数据的数据量所属的预设取值区间,将每个用户标识对应的用户历史数据从选定的用户历史数据中,拆分出来并进行存储所采用的方式(可以称为拆分存储方式)。其中,每个预设取值区间可以分别对应一种拆分存储方式。
在具体实施上述步骤S103是,可以采用的拆分存储方式具体可以包括以下几种:
对于数据量低的用户标识(称为不活跃用户标识),可以将多个不活跃用户标识对应的用户历史数据从选定的用户历史数据中,拆分出来并存储在同一张数据表中,可以将这种拆分存储方式称为“多用户单表拆分存储方式”;
对于数据量适中的用户标识(称为较活跃用户标识),可以将每个较活跃用户标识对应的用户历史数据从选定的用户历史数据中,拆分出来并存储在同一张数据表中,且一张数据表最多只存储一个较活跃用户标识对应的用户历史数据,可以将这种拆分存储方式称为“单用户单表拆分存储方式”;
对于数据量高的用户标识(称为活跃用户标识),由于一张数据表可能无法容纳活跃用户标识对应的用户历史数据,因此,可以将每个活跃用户标识对应的用户历史数据从选定的用户历史数据中,拆分出来并用多张数据表存储,可以将这种拆分存储方式称为“单用户多表拆分存储方式”;
其中,用于确定数据量高低程度的阈值可以由服务器设定,在后面会进行举例说明。
在本申请实施例中,根据上述说明可知,可以采用不同的拆分存储方式,将不同的用户标识对应的用户历史数据从选定的用户历史数据中,拆分出来并进行存储,以适应不同的用户标识的用户历史数据在未来对存储空间的不同需求。对选定的用户历史数据中包含的各用户标识分别执行上述操作的过程,即是对所述选定的用户历史数据进行拆分并存储的过程。
通过上述方法,在对所述选定的用户历史数据拆分存储后,当服务器要查询某条用户历史数据时,可以根据该条用户历史数据对应的用户标识,仅在存储该用户标识对应的各用户历史数据的数据表中查询该该条用户历史数据,而不需要遍历查询所有的数据表,因此,可以缩小查询范围,提高查询效率。
根据上述说明,对于上述步骤S102,根据确定出的每个用户标识对应的用户历史数据的数据量,对所述选定的用户历史数据进行拆分并存储,具体可以包括三种情况,以下分别进行说明:
第一种情况,第一种对于对应的用户历史数据的数据量不大于第一阈值的用户标识(可以是上述的不活跃用户标识),从所述选定的用户历史数据中,拆分出该用户标识对应的用户历史数据,并存储在一张第一数据表中,其中,每张所述第一数据表中存储至少一个用户标识对应的用户历史数据(也即,采用上述的多用户单表拆分存储方式)。
在实际应用中,由于不活跃用户标识的数量较多,一般可以占全部用户标识中的大部分,因此,当采用单表多用户的拆分存储方式时,虽然一张第一数据表中可以存储多个不活跃用户标识对应的用户历史数据,但是可能仍然需要多张第一数据表才能容纳全部的不活跃用户标识对应的用户历史数据。
为了进一步地提高后续针对不活跃用户标识对应的用户历史数据的查询效率,可以基于对不活跃用户标识进行取模的结果,确定将每个不活跃用户标识对应的用户历史数据存储在哪张第一数据表中(简称为用户标识取模拆分存储方式)。根据上述说明,在采用多用户单表拆分存储方式时,拆分出该用户标识对应的用户历史数据,并存储在一张第一数据表中,具体可以包括:拆分出该用户标识对应的用户历史数据,从该用户标识中,提取选定数字字段,并确定预设的第一数据表的数量;确定所述选定数字字段对所述数量取模的模值;将获取的用户历史数据存储在与所述模值对应的第一数据表中。
例如,假定预设有100张第一数据表,分别用数字0~99对各第一数据表进行编号,假定所述选定数字字段为用户标识本身。对于各不活跃用户标识中的某两个用户标识:用户标识A(为数字串“2014000001”)、用户标识B(为数字串“2014000002”)。通过取模计算可得:
2014000001mod100=1;
2014000002mod100=2;
则可以将用户标识A对应的用户历史数据存储在编号为1的第一数据表中,将用户标识B对应的用户历史数据存储在编号为2的第一数据表中。
在实际应用中,用户标识除了是数字串以外,还可能是包含数据串和其他字符(如英文字母)的字符串,例如,某不活跃用户标识可能为“CN10002003”,则可以将“10002003”作为选定数字字段,用于后续取模计算。
基于用户标识取模拆分存储方式进行拆分存储后,当要查询某不活跃用户标识对应的用户历史数据时,可以通过对该不活跃用户标识进行取模的方式,确定该不活跃用户标识对应的用户历史数据所在的那张第一数据表,从而有效地缩小了查询范围,提高了查询效率。并且,这种存储方式可以使用户历史数据在各第一数据表上的分布比较均匀。
需要说明的是,用户标识取模拆分存储方式只是多用户单表拆分存储方式的一种具体实现方式,所述第一存储方式还可以有其他的具体实现方式,例如,服务器针对各不活跃用户标识的用户历史数据,可以按照用户历史数据的生成时间顺序,依次将各用户历史数据存储在第一数据表中,等等。
第二种情况,对于对应的用户历史数据的数据量大于第一阈值且不大于第二阈值的用户标识(可以是上述的较活跃用户标识),从所述选定的用户历史数据中,拆分出该用户标识对应的用户历史数据,并存储在一张第二数据表中,其中,每张所述第二数据表中存储至多一个用户标识对应的用户历史数据(也即,采用上述的单用户单表拆分存储方式)。
第三种情况,对于对应的用户历史数据的数据量大于第二阈值的用户标识(可以是上述的活跃用户标识),从所述选定的用户历史数据中,拆分出该用户标识对应的用户历史数据,并分别根据拆分出的每条用户历史数据的指定属性,将该条用户历史数据储存在与该指定属性对应的一张第三数据表中,其中,所述指定属性包括生成时间(也即,采用上述的单用户多表拆分存储方式)。
例如,对于某活跃用户标识,可以将该活跃用户标识对应的用户历史数据按照生成时间进行分类,每个月内的各用户历史数据分别作为一类,将每类用户历史数据分别存储在一张第三数据表中。当然,除了按月分类以外,也可以按季度分类、按周分类,等等。
在本申请实施例中,服务器可以预先对所述第一阈值和所述第二阈值进行设定,以及还可以在设定后再调整,其中,第一阈值小于第二阈值。需要说明的是,本申请对第一阈值和第二阈值的具体取值并不做限定,在实际应用中,对于提供不同业务的服务器,适用的第一阈值和第二阈值可能也不相同,例如,对于某大型电商网站,在用户历史数据的数据量是所述用户历史数据的每月平均条数的情况下,一般可以将第一阈值设置为1万条,将第二阈值设置为20万条。
在本申请实施例中,第一数据表、或第二数据表、或第三数据表可以是用于存储用户历史数据的数据库中的数据表。
在本申请实施例中,在对所述选定的用户历史数据进行拆分并存储后,为了便于后续查询拆分存储后的各用户历史数据,还可以执行以下步骤:建立并保存每个用户标识与存储该用户标识对应的用户历史数据的数据表之间的对应关系;当接收到针对至少一条用户历史数据的查询请求时,根据所述至少一条用户历史数据对应的用户标识,在该用户标识对应的数据表中查询所述至少一条用户历史数据。这样的话,相比于现有技术中,这种查询方法可以缩小查询范围,提高查询效率。
需要说明的是,当采用上述的用户标识取模拆分存储方式,作为多用户单表拆分存储方式的具体实施方式时,由于可以直接通过对用户标识进行取模,确定存储该用户标识对应的用户历史数据的第一数据表,因此,对于这种情况下的各用户标识,也可以不建立并保存所述对应关系。
在本申请实施例中,由于用户标识对应用户历史数据,可能会随着所述用户标识的注册时长的增加而增加,而且所述用户标识的活跃程度也可能在所述用户标识的注册时长增加的过程中发生变化,从而,用户历史数据的数据量相应的也可能变化。因此,可以定期(如定期时间间隔可以是半年,或一个季度,等等)或不定期地重复执行本申请提供的数据拆分存储方法,从而可以实现对已拆分存储的用户历史数据的动态调整。
具体的,对于上述步骤S103,对所述选定的用户历史数据进行拆分并存储后,还可以定期地或不定期地执行以下步骤:获取在设定时间间隔后,新增的用户历史数据;在所述新增的用户历史数据和已被拆分并存储的各用户历史数据中,分别确定每个用户标识对应的用户历史数据的数据量;根据确定出的每个用户标识对应的用户历史数据的数据量,对所述新增的用户历史数据和已被拆分并存储的各用户历史数据重新进行拆分并存储。
图2为本申请实施例提供的对拆分存储方式进行动态调整的示意图。
可以看到,图2中的三个方框中分别示出了“用户标识取模拆分存储方式”、“单用户单表拆分存储方式”、“单用户多表拆分存储方式”。每个方框的旁边均示出了对应的条件,可以根据当前时刻的设定时段数据量,确定是否采用另一种拆分存储方式重新拆分存储用户历史数据。
在实际应用中,除了可以根据确定出的每个用户标识对应的用户历史数据的数据量,对选定的用户历史数据进行拆分并存储以外,类似的,也可以根据确定出的每个用户标识对应的用户历史数据的总数据量,对选定的用户历史数据进行拆分并存储,在此不再赘述。
以上为本申请实施例提供的数据拆分存储方法,基于同样的思路,本申请实施例还提供相应的数据拆分存储装置,如图3所示。
图3为本申请实施例提供的数据处理装置结构示意图,具体包括:
获取模块301,用于获取选定的用户历史数据;
确定模块302,用于在选定的用户历史数据中,分别确定每个用户标识对应的用户历史数据的数据量;
拆分存储模块303,用于根据确定出的每个用户标识对应的用户历史数据的数据量,对所述选定的用户历史数据进行拆分并存储。
所述拆分存储模块303具体用于:对于对应的用户历史数据的数据量不大于第一阈值的用户标识,拆分出该用户标识对应的用户历史数据,并存储在一张第一数据表中,其中,每张所述第一数据表中存储至少一个用户标识对应的用户历史数据;和/或
对于对应的用户历史数据的数据量大于第一阈值且不大于第二阈值的用户标识,拆分出该用户标识对应的用户历史数据,并存储在一张第二数据表中,其中,每张所述第二数据表中存储至多一个用户标识对应的用户历史数据;和/或
对于对应的用户历史数据的数据量大于第二阈值的用户标识,拆分出该用户标识对应的用户历史数据,并分别根据拆分出的每条用户历史数据的指定属性,将该条用户历史数据储存在与该指定属性对应的一张第三数据表中,其中,所述指定属性包括生成时间;
其中,第一阈值小于第二阈值。
所述拆分存储模块303拆分出该用户标识对应的用户历史数据,并存储在一张第一数据表中,具体包括:所述拆分存储模块303拆分出该用户标识对应的用户历史数据,从该用户标识中,提取选定数字字段,并确定预设的第一数据表的数量;确定所述选定数字字段对所述数量取模的模值;将获取的用户历史数据存储在与所述模值对应的第一数据表中。
所述装置还包括:
保存模块304,用于在所述拆分存储模块对所述选定的用户历史数据进行拆分并存储后,建立并保存每个用户标识与存储该用户标识对应的用户历史数据的数据表之间的对应关系;
查询模块305,用于当接收到针对至少一条用户历史数据的查询请求时,根据所述至少一条用户历史数据对应的用户标识,在该用户标识对应的数据表中查询所述至少一条用户历史数据。
用户历史数据的数据量包括:所述用户历史数据在设定时段的平均数据量。
所述装置306还包括:
更新模块,用于在所述拆分存储模块对所述选定的用户历史数据进行拆分并存储后,获取在设定时间间隔后,新增的用户历史数据,在所述新增的用户历史数据和已被拆分并存储的各用户历史数据中,分别确定每个用户标识对应的用户历史数据的数据量,根据确定出的每个用户标识对应的用户历史数据的数据量,对所述新增的用户历史数据和已被拆分并存储的各用户历史数据重新进行拆分并存储。
具体的上述如图3所示的装置可以位于服务器上。
本申请实施例提供一种数据拆分存储方法及装置,该方法包括:获取选定的用户历史数据;在所述选定的用户历史数据中,分别确定每个用户标识对应的用户历史数据的数据量;根据确定出的每个用户标识对应的用户历史数据的数据量,对所述选定的用户历史数据进行拆分并存储。通过上述方法,在对所述选定的用户历史数据拆分存储后,当服务器要查询某条用户历史数据时,可以根据该条用户历史数据对应的用户标识,仅在存储该用户标识对应的各用户历史数据的数据表中查询该该条用户历史数据,而不需要遍历查询所有的数据表,因此,可以缩小查询范围,提高查询效率。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。