数据存储方法及装置、数据查找方法及装置与流程

文档序号:29869449发布日期:2022-04-30 17:34阅读:63来源:国知局
1.本说明书一个或多个实施例涉及数据存储
技术领域
:,尤其涉及数据存储方法及装置、数据查找方法及装置。
背景技术
::2.在lsm(logstructuredmerge)的存储方式中,为了提升写入性能,通常会采用数据分层的组织方式,在任意一层中,通过对主键key排序后划分的方式将数据切割为多个文件进行存储。同时,该层的数据积累到一定量之后,将该层的数据存储到下一层;通常,随着层数的升高,数据规模变大。3.目前,上述数据分割的方式导致数据查找时文件定位的时间较长。技术实现要素:4.本说明书一个或多个实施例描述了一种数据存储的方法及装置、数据查找的方法及装置,可以基于映射函数和层的文件数目,快速精准的实现同一层的数据分割,进一步降低数据查找时层的文件定位的时间。5.根据第一方面,提供了一种数据存储方法,应用于数据库引擎,所述数据库引擎通过n层的结构以文件的形式存储数据,所述n为大于1的正整数,所述方法包括:确定待存储至所述n层中第i层的第一数据,所述第一数据具有第一数据标识;根据预设的映射函数和所述第i层的文件的第一数目对所述第一数据标识进行映射,以确定所述第一数据标识在所述第i层的文件中的第一文件编号;将所述第一数据存储至所述第一文件编号对应的第一文件中。6.根据一种可能的实施方式,所述映射函数包括第一函数和第二函数,所述根据预设的映射函数和所述第i层的文件的第一数目对所述第一数据标识进行映射,以确定所述第一数据标识在所述第i层的文件中的第一文件编号,包括:利用第一函数,对所述第一数据标识进行第一映射,得到所述第一数据标识对应的第一映射数值;利用第二函数,对所述第一数目和所述第一映射数值进行计算,得到所述第一文件编号。7.在一个实施例中,所述第一函数为哈希函数;所述第二函数为针对所述第一数目的取模函数。8.根据一种可能的实施方式,确定待存储至所述n层中第i层的第一数据,包括:响应于预设触发条件,从第i-1层的第二文件中确定所述第一数据,其中第i-1层包含第二数目的文件,所述第二数目小于所述第一数目。9.在一个实施例中,所述预设触发条件包括以下之一:所述第i-1层的数据数量达到第一阈值;所述第二文件中的数据数量达到第二阈值。10.在一个实施例中,所述方法还包括:根据所述第二文件的第二文件编号和层间文件重叠关系,确定所述第i层中与所述第二文件存在重叠关系的重叠文件编号;基于所述第二文件编号和重叠文件编号,进行文件数据管理。11.根据一种实施方式,所述重叠文件编号与所述第二文件编号之差,为所述第二数目的倍数。12.根据一种实施方式,所述文件数据管理包括以下中至少一项:文件合并,文件垃圾回收。13.在一个实施例中,所述第二文件中还包括具有第二数据标识的第二数据,所述第二数据标识经所述映射函数映射为所述第一文件编号:所述将所述第一数据存储至所述第一文件编号对应的第一文件中,包括:至少将所述第一数据和第二数据,批量存储至所述第一文件。14.在上述实施方式的一个实施例中,所述第一数据标识为所述第一数据的主键。15.根据第二方面,提供了一种数据查询方法,应用于数据库引擎,所述数据库引擎通过n层的结构以文件的形式存储数据,包括:确定待查询的第一数据标识;按照从上层到下层的顺序对所述n层进行逐层查询,其中针对任意当前层,根据预设的映射函数和当前层的文件数目对所述第一数据标识进行映射,将映射结果作为当前层中待查询的文件编号,直到查找到第i层的第一文件编号,所述第i层的第一文件编号对应的第一文件中存储有所述第一数据标识对应的第一数据;从所述第一文件中提取出所述第一数据。16.根据一种可能的实施方式,所述映射函数包括第一函数和第二函数,所述根据预设的映射函数和当前层的文件数目对所述第一数据标识进行映射,包括:利用第一函数,对所述第一数据标识进行第一映射,得到所述第一数据标识对应的第一映射数值;利用第二函数,对所述当前层的文件数目和所述第一映射数值进行计算,得到所述当前层中待查询的文件编号。17.在一个实施例中,所述第一函数为哈希函数;所述第二函数为针对所述第一数目的取模函数。18.根据第三方面,提供了一种数据存储装置,部署在数据库引擎中,所述数据库引擎通过n层的结构以文件的形式存储数据,所述n为大于1的正整数,装置包括:数据确定模块,配置为确定待存储至所述n层中第i层的第一数据,所述第一数据具有第一数据标识;映射模块,配置为根据预设的映射函数和所述第i层的文件数目对所述第一数据标识进行映射,以确定所述第一数据标识在所述第i层的文件中的第一文件编号;存储模块,配置为将所述第一数据存储至所述第一文件编号对应的第一文件中。19.根据第四方面,提供了一种数据查找装置,部署在数据库引擎中,所述数据库引擎通过n层的结构以文件的形式存储数据,装置包括:标识确定单元,配置为确定待查询的第一数据标识;查找单元,配置为按照从上层到下层的顺序对所述n层进行逐层查询,其中针对任意当前层,根据预设的映射函数和当前层的文件数目对所述第一数据标识进行映射,将映射结果作为当前层中待查询的文件编号,直到查找到第i层的第一文件编号,所述第i层的第一文件编号所对应的第一文件中存储有所述第一数据标识对应的第一数据;提取单元,配置为从所述第一文件中提取出所述第一数据。20.根据第五方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面或第二方面所述的方法。21.根据第六方面,提供了一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面或第二方面的方法。22.在本说明书的实施例中,针对任意层,通过预设的映射函数和层的文件数目,快速精准的实现同一层的数据分割。进一步地,基于如此形成的n层的结构,可以快速精准地实现在数据查找时层的文件定位以及层间重叠文件合并时的重叠文件定位。附图说明23.为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。24.图1示出数据库的n层结构的示意图;图2a示出n层结构的初始层间数据存储的示意图;图2b示出n层结构的同一层的数据分割的示意图;图2c示出n层结构的层间重叠文件合并的示意图;图3示出在一个实施例中n层结构的示意图;图4a示出一个实施例中的同一层的数据分割的示例图;图4b示出一个实施例中的初始层间数据存储的示意图;图4c示出一个实施例中的层间重叠文件合并的示意图;图5示出根据一个实施例的数据存储方法的流程图;图6示出根据一个实施例的层间重叠文件合并的流程图;图7示出根据一个实施例的数据查询方法的流程图;图8示出根据一个实施例的数据存储装置的结构示意图;图9示出根据一个实施例的数据查询装置的结构示意图。具体实施方式25.下面结合附图,对本说明书提供的方案进行描述。26.目前,随着互联网的发展,产生了海量数据,为了便于对数据进行管理,通过数据库存储数据,并通过数据库引擎实现对数据库的数据的读写操作,比如查询、存储、修改、删除、增加等,从而满足业务对数据的需求。其中,数据库是按照数据结构来组织、存储和管理数据的仓库。而数据库的数据结构,影响数据库引擎对数据库的读写操作,进而影响业务的实现。27.为了确保数据库的性能,在一种方案中,提供了一种n层结构作为数据库的数据结构进行数据存储。为了便于理解本说明书实施例提供的技术方案,下面先对上述n层结构进行简要说明。28.图1示出数据库的n层结构的示意图。如图1所示,最新写入的数据存放至内存的memtable(内存表),以记录最近修改的数据,当memtable存储的数据达到一定数量后,变成不可变的immmemtable,即只能读取不能写入或者删除,同时新建一个新的memtable,后续的数据修改操作均在新的memtable内进行;然后,将immmemtable写入非易失性存储器(non-volatilememory)例如硬盘中数据库的level0层;当level0层的数据积累到一定量之后,再刷新至更高层次的level1层,因此,随着层数的升高,数据规模变大。图2a示出n层结构的初始层间数据存储的示意图。如图2a所示,当level1层的数据积累到一定量后,刷新至更高层次的level2层,由于level2没有数据,直接将level1层的数据刷新至level2层即可。其中,刷新可以理解为将数据复制到下一层。29.同时,在任意一层中,对待存储的数据的主键key进行排序将数据切割为多个互不重叠的文件进行存储;对应的,每个文件存储的是一系列的有序键值对,即按照记录的主键排序的。图2b示出n层结构的同一层的数据分割的示意图。如图2b所示,假设40个键值对需要存储至level2层,level2层的文件数量为10,则对40个键值对的主键key进行排序,从而将数据切割为互不重叠的10个文件进行存储。需要说明的是,对于图2a和图2b,通过(keyi,vi)表示键值对,keyi中的i表示key的排序,vi表示主键keyi对应的value值,i=1、2、……。另外,在实际应用中,还可以规定文件的大小,对于待存储的数据,首先按主键key进行排序,然后将排序后结果写入到新的文件中,如果新的文件大小到了规定的大小,就新生成文件继续写。如此类推,直到写完所有数据。30.由于不断有immmemtable从内存刷新到磁盘,上述数据分割仅仅针对待存储的数据,并不对已经存储的数据进行处理,因此数据存储的后期,文件的数量会逐渐增多,其内部存储的数据也会产生很多过期数据(主键key的过期数据),通过比对文件的主键key的范围确定层间重叠文件,对层间重叠文件进行合并,并回收旧文件,即文件垃圾回收,一方面减少文件的数量,同时也删除过期的数据。31.图2c示出n层结构的层间重叠文件合并的示意图。如图2c所示,对level1的第2个文件,当需要进行层间重叠文件合并时,比如,定期处理、level1的文件数量达到设定阈值、或者,level1的数据数量达到设定阈值,确定level2中与level1的第2个文件重叠的是第1、2、3个文件,即3个合并前文件,然后,对这些文件进行合并,用v262、v272、…、v502这些新数据,替代过期数据v261、v271、…、v501,形成3个合并后文件存放在level2中,并回收3个合并前文件。需要说明的是,对于图2c,通过(keyi,vij)表示键值对,keyi中的i表示key的排序,考虑到主键keyi的值可能会不断的变化,通过vij表示主键keyi对应的value值的第j次改变后的值,i=1、2、…,j=1、2、…。另外,level0的文件是直接从memtable转化来的,没有办法保证这些文件互不重叠,因此,可以规定level0的数量不能超过4个:当达到4个时,我们将这4个文件一起合并去重,形成一组互不重叠的文件,再将其转存到level1中。32.因此,对于基于数据的主键key排序实现数据分割的方式,一方面,通过主键key的范围的比对,实现数据查找时层的文件定位以及层间重叠文件合并时的重叠文件定位。然而,主键key是比较耗时的字符,导致数据查找时层的文件定位以及层间重叠文件合并时的重叠文件定位需花费较多时间;另一方面,对于任意一层,在数据查询时的复杂度为logn(其中n为单层文件数目),在数据规模较大,文件数目较多时,文件查找的耗时增加。33.为进一步提升数据写入和查询时的效率,在本说明书的一些实施例中,提出通过映射函数和层的文件数目,快速精准地实现数据所存文件的定位以实现数据分割,同时,映射函数定义了数据标识和文件编号之间的关系,确定了映射函数即可确定层间文件重叠关系。后续,基于如此形成的n层的结构,基于预设的映射函数和层的文件数目,可以降低数据查找时层的文件定位以及层间重叠文件合并时的重叠文件定位的时间。34.下面介绍本说明书实施例提供的n层结构,主要从3个方面进行描述,分别为层的文件划分、同一层的数据分割、层间数据存储。35.第一方面:层的文件划分1.任一层的文件数目是m的指数级的倍数。其中,m为大于等于2的正整数。36.在一个实施方式中,m=2。37.示例地,任一层的文件数目是2的m1次方(m1为正整数)。比如,图3示出的level0层文件数目为4(2的2次方,即m1=2)、level1层的文件数目为16(2的4次方,即m1=4)、level3层的文件数目为64(2的6次方,即m1=6)等。38.需要说明的是,m=2仅仅作为示例,并不构成限定,任何大于等于2的正整数皆可,比如m=3,再比如m=4。值得注意的是,考虑到计算机以二进制进行计算,在层的文件数目是2的m1次方时,便于实现文件的处理。39.2.任一层的文件数目小于其下一层的文件数目。40.示例地,图3示出的level0层的文件数目4小于level1层的文件数目16,level1层的文件数目16小于level2层的文件数目64。41.3.层与层的之间的文件数目存在倍数关系。42.在一个实施方式中,层与层之间的文件数目的倍数为m的倍数。43.示例地,任一层的文件数目相对于上一层的文件数目的倍数为2的m2次方(m2为正整数)。比如,图2示出的level1层的文件数目16是level0层的文件数目4的4(2的2次方,即m2=2)倍,level2层的文件数目64是level1层的文件数目16的4(2的2次方,即m2=2)倍。44.需要说明的是,n层结构存储的数据位于硬盘中。45.第二方面:同一层的数据分割考虑到每一层的数据分割的方式相同,这里以第i层的数据划分到u个文件为例进行描述。46.根据一种可能的实施方式,映射函数用于对数据标识进行映射得到映射数值;对映射数值和第i层的文件数目u进行计算,得到文件编号;之后,将数据标识对应的数据存储到文件编号对应的文件,实现数据分割。47.需要说明的是,不同数据标识可以映射为相同的文件编号,文件编号对应的数据标识的数量不做任何限制,任意数据标识均可映射到不同层的文件,从而使得数据分割具有较强的灵活性和可拓展性。48.在一个实施例中,数据标识为主键key。文件存储的是一系列的键值对。映射函数如下公式(1)所示:fileindexi=function2(function1(key),u)(1)其中,fileindexi表示第i层的文件编号;function1表示第一函数;function1(key)表示利用第一函数对数据标识进行映射后的映射数值;function2表示第二函数;function2(function1(key),u)表示利用第二函数对映射数值和第i层的文件数目u进行计算。其中,第一函数和第二函数形成映射函数。49.作为一个示例,第一函数可以为哈希函数。第二函数可以为对第i层的文件数目u进行取模的取模函数。其中,哈希函数可以将任意长度的数据标识映射成固定长度的映射数值。对应的,上述映射数值为哈希值。50.在该示例下,还可以通过如下公式(2)表示第i层的文件编号:fileindexi=function1(key)-int(function1(key)/u)*u(2)其中,int(function1(key)/u)表示对function1(key)除以u得到的数值取整的结果。51.示例地,在图3所示的n层结构下,假设数据标识的映射数值为20,其在各个层的文件编号如下:level0层中的文件数目为4,则fileindex0=20-4*5=0,即文件编号为0。52.level1层中的文件数目为16,其fileindex1=20-1*16=4,即文件编号为4。53.level2层中的文件数目为64,其fileindex2=20-0*64=20,即文件编号为20。54.值得注意的是,对于第i层的第j个文件fileindexij相关的映射数值,第j个文件的文件编号和映射数值之间的差值,为第i层的文件数目u的倍数;换言之,第i层的第j个文件和其相关的映射数值满足如下公式(3):fileindexij=function1(key)-n*u(3)其中,n表示任意正整数,n=0、1、2、3、…。示例地,如图3所示,第0层的文件数目为4,对于文件编号为0的文件,该文件相关的映射数值为0(0+0*4)、4(0+1*4)、8(0+2*4)、12(0+3*4)、…。55.值得注意的是,映射函数和层间文件重叠关系相辅相成。示例地,映射函数如上述公式(2)所示,假设第level(i+1)层有v个文件,第i层的第j个文件(表示为fileindexij)在i+1层的重叠文件编号表示为cfileindex-ij;则在该示例下,level(i+1)层与leveli层中第j个文件的层间文件重叠关系如下公式(4)所示:cfileindex-ij=fileindexij+n*u,n=0、1、2、...、ofilecount(4)其中,ofilecount表示第i+1层中和第i层的第j个文件的重叠文件数量,ofilecount=level(i+1)层的文件数目v/leveli层的文件数目u。对应的,重叠文件编号为[fileindexij,fileindexij+u,fileindexij+2*u,...,fileindexij+ofilecount*u]。[0056]举例来说,如图3所示,对于第0层的第0个文件,第1层中和其重叠的文件的数量为4(16/4),第1层的4个重叠文件编号分别为0、4、8、12;对于第1层的第0个文件,第2层中和其重叠的文件的数量为4(64/16),第2层的4个重叠文件编号分别为0、16、32、48。[0057]图4a示出一个实施例中的同一层的数据分割的示例图。如图4a所示,在level0层,按照哈希函数,将键值对中的主键key映射成映射数值,基于映射数值对第0层的文件数目进行取模运算,得到文件编号;之后,将相同文件编号的键值对存储到该文件编号对应的文件中,得到第0层的4个文件。对于图4a,通过(keyi,vi)表示键值对,keyi中的i表示key的映射数值,vi表示主键keyi对应的value值,i=1、2、……。[0058]该数据分割方式相对于图2b示出的分割方式来说,无需对主键key进行排序,仅仅考虑数据标识和层的文件数目,通过映射函数进行计算,从而在计算的时间即常量时间内精准地定位数据所存文件,从而快速实现数据分割。[0059]第三方面:层间数据存储需要说明的是,考虑到本说明书实施例提供的数据分割的方式不限制文件的数据标识的数量,在实际应用中,某一文件的数据数量可能较大,为了防止文件的过大,在层间的数据存储时,以文件的数据数量作为层间数据存储的条件,比如,在第i层的某一文件的数据数量达到第二阈值时,将该文件的数据,存储到第i+1层。当然,也可以层的数据数量、存储周期(即按照预设时间间隔定期进行层间数据存储)作为层间数据存储的条件,比如,在第i层的数据数量达到第一阈值,或者,满足存储周期时,将第i层的所有数据、数据数量达到第二阈值的一个或多个文件的数据、或者数据数量最大的一个或多个文件的数据,存储到第i+1层。需要说明的是,第一阈值和第二阈值可以结合实际需求确定,本说明书实施例对此不做具体限定。[0060]下面以第i层的第j个文件存储至第i+1层的为例进行层间数据存储的说明,第j个文件以键值对的方式存储数据。其中,在第j个文件的数据数量达到第二阈值,或者,满足存储周期或第i层的数据数量达到第一阈值,且第j个文件为第i层的数据数量最大的一个或多个文件中的一个时,需要将第j个文件存储至第i+1层。[0061]在前期的数据存储,由于层中没有存储数据,第i+1层中和第j个文件存在重叠关系的重叠文件编号对应的文件为空(即不存在文件)或者未存储数据(存在文件,但是没有存储键值对),对于第i层的第j个文件,确定第j个文件中存储的各数据的目标数据标识在第i+1层的目标文件编号;将第j层中属于相同目标文件编号的各数据存储至第i+1层的该编号对应的文件即可。[0062]值得注意的是,由于不知道第i层的第j个文件中存储的各数据在第i+1层的具体存储位置,因此上述确定目标文件编号的过程,需要基于预设的映射函数和第i+1层的文件数目,对上述目标数据标识进行映射,得到在第i+1层的文件编号作为目标文件编号。示例地,本说明书实施例在第i层的第j个文件的数据数量过大时,将第j个文件合并到第i+1层,即将第j个文件的所有数据存储到第i+1层。图4b示出一个实施例中的初始层间数据存储的示意图。如图4b所示,在level0层的第0个文件的数据数量积累到一定量后,将第0个文件的数据存储到第1层,得到文件编号为0、4、8、12的文件。对于图4b,通过(keyi,vij)表示键值对,keyi中的i表示key的映射数值,考虑到主键keyi对应的value值可能会不断的变化,通过vij表示主键keyi对应的value值的第j次改变后的值,i=1、2、……,j=1、2。[0063]之后,第i+1层中和第j个文件存在重叠关系的重叠文件编号所对应的文件存储有数据,进一步地,在后续的层间数据存储的过程中,可基于层间文件重叠关系进行文件数据管理,实现层间重叠文件合并,以将第i层的第j个文件中的数据存储至第i+1层。在一个实施例中,文件数据管理包括合并和文件垃圾回收。[0064]在一个实施例中,对于第i层的第j个文件,若第j个文件的数据需要存储至第i+1层时,确定第i+1层中和第j个文件具有重叠关系的各重叠文件编号;确定第j个文件中存储的各数据的目标数据标识在第i+1层的目标文件编号(属于重叠文件编号);基于各目标文件编号,对第j个文件和各重叠文件编号对应的文件进行合并,得到一个或多个文件(文件编号为上述重叠文件编号),实现层间重叠文件合并。这里,在合并前,将第j个文件和各重叠文件编号对应的文件分别称为合并前文件,将合并后的一个或多个文件分别称为合并后文件。其中,合并包括组合和更新。[0065]具体地,组合可以理解为对于所有合并前文件中的数据,将相同文件编号下的数据以键值对的方式归并为一个整体,为了便于描述,将相同文件编号下归并后的数据称为组合后数据;示例地,对于重叠文件编号,组合后数据包括第i层的重叠文件编号所对应的合并前文件中的各数据,以及,第j个文件中的属于该重叠文件编号的目标文件编号对应的各数据;需要说明的是,组合后数据可能会出现重复数据,比如,主键key对应的多个value值相同;也可能会出现过期数据和最新数据,比如,主键key对应的多个value值,这些value值的写入时刻不同,最后写入的数据为最新数据,更早写入的数据为旧数据即过期数据;还可能会存在该编号下的合并前文件中未存储的目标数据标识和其对应的value值(来自第j个文件),比如,图4c示出一个实施例中的层间重叠文件合并的示意图;如图4c所示,level1的合并后的第0个文件相对于合并前的第0个文件,新增了目标数据标识key48。图4c和图4b通过相同的方式表示键值对,详细内容参见上文,此处不再赘述。[0066]具体地,更新可以理解为对于重叠文件编号下的组合后数据,删除重复数据、保留最新数据删除过期数据等,进一步地,组合后数据更新后以文件形式存储,得到的文件为合并后文件。值得注意的是,若在层间数据存储时合并的过程仅仅为组合,即对于重叠文件编号,之后,将所对应的上述组合后数据以文件的形式存储后得到合并后文件,可能会导致合并后文件的数据数量较大;后续,需要定期对文件进行更新或者组合更新,从而去除过期数据、重复数据等,得到新的文件,虽然减少了更新次数,但是会增加计算量;另外,考虑到对存储至硬盘中的文件的部分数据修改的方式,需要对硬盘的同一位置进行数据删除和重新写入,容易降低数据存储时写操作的性能;因此,本说明书实施例中存储在硬盘中的文件是不可修改的(即一旦生成便不会对文件中的数据进行需改,只能读取或删除,因为在写操作的过程中没有文件被编辑,从而在一定程度上提高写操作的性能),文件的数据的修改会直接写入内存,进一步地,还需要将新的文件存储到硬盘的可存储的区域,确保写操作的性能,增加了硬盘文件读取和硬盘文件存储的次数;综上,本说明实施例在层间数据存储时选择组合和更新的方式进行合并,使得合并后文件不存在重复数据和过期数据,可以在一定程度上降低计算量以及硬盘文件读取、硬盘文件存储的次数。[0067]在合并的过程中,可能存在第i+1层的重叠文件编号对应的文件为空(即不存在合并前文件)或者未存储数据(即合并前文件未存储数据),对应的,合并的过程实质是对第j个文件和重叠文件编号所对应的存储有数据的文件的数据进行合并,换言之,对存储有数据的多个合并前文件进行合并。具体地,对于任意一个重叠文件编号,若合并前,该编号对应的文件为空,若合并后该编号对应有新文件则将该文件作为合并后文件;若合并前后该编号对应的文件的数据没有改变,比如,主键key对应的value值未变化、没有新增键值对,则将合并前文件直接作为合并后文件;否则,合并后会生成新的文件(上述合并后文件),该文件相对于合并前文件,删除了主键key的过期数据、存储主键key的最新数据,和/或,新增键值对;在一个示例中,合并前文件未存储数据,若合并后该编号对应有新文件则将该文件作为合并后文件,则可认为合并后文件相对于合并前文件来说,新增了键值对;在另一个示例中,合并前文件存储有数据,合并后文件保留合并前文件中的数据标识,但存储该数据标识下的最新数据,即合并后文件相对于合并前文件,去除了过期数据存储了最新数据;进一步地,若该编号下还存在新存入的数据标识(来自于第j个文件),则合并后文件存储该新存入的数据标识,以及该新存入的数据标识下的最新数据,即合并后文件相对于合并前文件,还新增了键值对。[0068]进一步地,对于第i层的重叠文件编号,若该编号所对应的合并前后文件所存储的数据发生改变,比如,主键key对应了新的数据、新增了键值对,则需要将合并后文件存储至第i层,并回收合并前文件,实现文件更新;否则,无需将合并后文件存储至第i层,避免相同的文件的重复存储,减少写成本。值得注意的是,在实际应用中,合并的过程需要从硬盘中读取存在数据的多个合并前文件(上述第j个文件和第i+1层的各重叠文件编号的存储有数据的文件)至内存,数据库引擎会对内存中的多个合并前文件进行合并,得到一个或多个合并后文件,并将这些文件存储在内存中;之后,对于同一重叠文件编号,若该编号下的合并前后文件的数据发生改变,删除硬盘中的合并前文件,并将内存中的合并后文件写入硬盘;若该编号下的合并前后文件的数据未改变,保留硬盘中的合并前文件;最后,对合并完成后在内存中的文件进行文件垃圾回收。值得注意的是,硬盘中的文件是不可修改的,在层间重叠文件合并的过程中,需要对硬盘中的文件进行删除和写入;若该过程过于频繁,容易导致数据存储的性能下降;因此,需要适当降低层间重叠文件合并的次数,减少不必要的层间重叠文件合并,基于此,对于层间重叠文件合并,优选对第i层的数据数量最大的一个或多个文件和第i+1层的文件进行层间重叠文件合并,确保数据存储的性能。[0069]举例来说,如图4c所示,假设第0层的文件编号为0的文件,为了便于描述称为0-0,第1层的重叠文件编号为0、4、8、12,为了便于描述将重叠文件编号对应的4个文件分别称为1-0、1-4、1-8、1-12,文件1-12未存储数据;在需要将文件0-0的数据写入第1层时,需要将硬盘中的合并前文件0-0、1-0、1-4、1-8这4个文件读取到内存中,由数据库引擎进行合并,得到合并后文件1-0、1-4、1-8、1-12并存储在内存中,由于合并前后文件1-4存储的数据没有发生改变,将合并后文件1-0、1-8、1-12写入硬盘中的第1层即可,删除硬盘中的合并前文件0-0、1-0、1-8,以及内存中的文件垃圾进行回收,实现层间数据存储。对于合并后文件1-0,相对于合并前文件1-0,key0对应的最新的value值v03替代过期value值v02,增加来自于文件0-0的键值对(key48,v482),主键key48的映射数值为48,v482为主键key48对应的最新value值;对于合并后文件1-8,相对于合并前文件1-8,保留合并前文件的键值对,并增加了来自0-0的键值对(key56,v562),主键key56的映射数值为56,v562为主键key56对应的最新value值;对于合并后文件1-2,合并前文件未存储数据,则新的文件作为合并后文件。[0070]综上,基于本说明书实施例提供的数据分割的方式,一方面,通过映射函数和层的文件数目的运算,无需进行主键key的比对,降低了数据查找时层的文件定位以及层间重叠文件合并时的重叠文件定位的时间;另一方面,在数据查询时的复杂度为层数n,降低了数据查询的复杂度;同时,对于任意一层,在数据查询时,若数据规模较大,文件数目较多,文件查找的耗时为通过映射函数进行计算的时间,并不会增加文件查找的时间。[0071]接下来基于上述描述的n层结构的存储方式,介绍本方案提供的一种数据存储方法。详见下文描述。[0072]图5示出了本说明书实施例提供的一种数据存储方法的流程示例图。如图5所示,该方法包括以下步骤:步骤51,确定待存储至n层中第i层的第一数据,第一数据具有第一数据标识;步骤52,根据预设的映射函数和第i层的文件的第一数目对第一数据标识进行映射,以确定第一数据标识在第i层的文件中的第一文件编号;步骤53,将第一数据存储至第一文件编号对应的第一文件中。下面对上述各个步骤的具体执行过程进行详细描述。[0073]首先在步骤51,确定待存储至n层中第i层的第一数据,第一数据具有第一数据标识。其中,第一数据为待存储至第i层的所有数据中的任一数据。[0074]根据一种可能的实施方式,第一数据标识为主键,第一数据为主键对应的value值。在一个例子中,主键用于作为表的行的唯一标识。value值可以作为表的一个或多个字段的值。示例地,主键可以为用户卡号,value值可以为用户名称、生日、学历、婚姻状态、银行存款、工作城市等。[0075]根据一种可能的实施方式,第i层为n层的顶层,第一数据为immmemtable中的数据。[0076]根据一种可能的实施方式,第一数据为第i-1层的数据。其中,第i-1层的文件的第二数目小于第i层的文件的第一数目。[0077]在一个实施例中,响应于预设触发条件,从第i-1层的第二文件中确定第一数据,从而将上述第一数据存储到第i层。[0078]作为一个示例,触发条件可以为第i-1层的数据数量达到第一阈值,或者,满足存储周期。在实际应用中,会将第i-1层的所有文件分别作为第二文件,将达到第二阈值的一个或多个文件分别作为第二文件,或者,将第i-1层的数据数量最大的一个或多个文件分别作为第二文件,之后将各第二文件的各数据分别作为第一数据。[0079]作为一个示例,触发条件可以为第二文件的数据数量达到第二阈值。在实际应用中,将第二文件中的各数据分别作为第一数据。[0080]在该示例下,若第i-1层写入了新的数据,新的数据替代第i-1层的过期数据,生成了新的文件,若新的文件的数据数量大于第二阈值,或者,新的文件使得第i-1层的数据数量大于第二阈值,将生成的新的文件作为第二文件即可。[0081]在步骤52,根据预设的映射函数和第i层的文件的第一数目对第一数据标识进行映射,以确定第一数据标识在第i层的文件中的第一文件编号,从而将第一数据标识和第i层的文件进行关联。[0082]根据一种可能的实施方式,映射函数包括第一函数和第二函数,根据第一函数对所述第一数据标识进行第一映射,得到第一数据标识对应的第一映射数值;利用第二函数,对第一数目和第一映射数值进行计算,得到第一文件编号。[0083]在一个例子中,第一函数为哈希函数,第二函数为针对第一数目的取模函数,从而便于管理和文件管理。对应的,第一映射数值和第一文件编号之差为第一数目的倍数,第i层的文件编号为有序数列,比如,如图3所示,第0层的文件编号为从0到3的有序数列,第1层的文件编号为从0至16的有序数列。在步骤53,将第一数据存储至所述第一文件编号对应的第一文件中。[0084]根据一种实施方式,对于有待存储至第i层的各数据,分别将其作为第一数据,在确定出对应的第一文件编号后,就将该第一数据存储至对应的第一文件。[0085]根据另一种可能的实施方式,采用批量存储的方式来加速转存过程。具体的,可以针对i-1层任意的第二文件,在根据映射函数和第i层的文件数目,完成对第二文件中所有数据标识的映射后,将映射至相同文件编号的数据标识对应的数据,批量存放至该文件编号对应的文件。如此,对于第二文件中的任一个第一数据,存在这样的情况,即第二文件中还包括一个或多个第二数据,其具有不同于第一数据标识的第二数据标识,但是,经过映射函数的映射,第二数据标识同样被映射至第i层的第一文件编号。此时,可将第一数据和第二数据批量存储至上述第一文件。例如,在图3的示例中,当将level0文件0中映射数值为0的数据作为第一数据时,其中映射数值为16,32,48的数据可以作为第二数据,与第一数据一并批量存储至level1文件0中。[0086]需要说明的是,根据第二文件的第二文件编号和层间文件重叠关系,可以确定第i层中与第二文件存在重叠关系的重叠文件编号。[0087]在一个实施例中,第i层未存储数据,或者,第一数据来自第二文件,且第i层中与第二文件存在重叠关系的重叠文件编号未对应有文件或对应的文件未存储数据,则将属于相同文件编号的数据标识对应的数据,批量存放至该文件编号对应的文件即可,从而将第一数据存储至第i层的第一文件。举例来说,假设w个数据标识中,第1至第w/2个数据标识分别映射得到的文件编号均为0,第1+w/2至第w个数据标识分别映射得到的文件编号均为1,则将第1至第w/2个数据标识对应的第一数据存储至文件编号为0对应的文件,第1+w/2至第w个数据标识对应的第一数据存储至文件编号为1对应的文件。[0088]在一个实施例中,第一数据来自第二文件,且第i层中存在一个或多个第三文件,第三文件的文件编号为与第二文件存在重叠关系的重叠文件编号且存储有数据(即上述重叠文件编号下的存储有数据的合并前文件),则对一个或多个第三文件和第二文件进行合并,确定合并后的一个或多个第四文件(即上述合并后文件),第四文件的文件编号为与第二文件存在重叠关系的重叠文件编号,从而将第一数据存储至第i层的第一文件,第一文件为一个或多个第四文件中的任一文件;后续,对一个或多个第三文件和第二文件进行文件垃圾回收,实现文件数据管理。[0089]需要说明的是,在实际应用中,同一层中一个文件编号对应一个文件,因此,不同第三文件的重叠文件编号不同。[0090]示例地,基于层间文件重叠关系,确定第i层中和第二文件存在重叠关系的存储有数据的文件,将该文件作为第三文件;或者,基于所有第一数据和各第一数据标识在第i层的文件中的重叠文件编号,确定合并前后文件的数据是否发生改变,如改变,则将该文件作为第三文件。考虑到判断合并前后文件的数据是否发生改变需要比对数据标识,消耗算力,在实际应用中,优选将具有重叠关系的且存储有数据的文件作为第三文件。[0091]值得注意的是,合并后的各第四文件可以和各第三文件的重叠文件编号完全一样,也可以部分一样。示例地,如图4c所示,合并前的第三文件有3个,参见上文描述,分别为文件1-0、1-4、1-8;合并后的第四文件有4个,参见上文描述,分别为文件1-0、1-4、1-8、1-12。[0092]示例地,对于第二文件,将第二文件作为垃圾文件,删除硬盘中的第二文件,实现文件垃圾回收。[0093]示例地,对于重叠文件编号来说,通过如下三种情况说明文件垃圾回收。[0094]在第一种可能的情况,若该编号下的第三文件和第四文件存储的数据不同,将内存中的第四文件写入硬盘,并删除硬盘中的第三文件。在实际应用中,基于重叠文件编号对应的第三文件和属于该重叠文件编号的第一数据进行合并,生成第四文件。[0095]在第二种可能的情况,若该编号下的第三文件和第四文件存储的数据相同,考虑到合并过程中需要读取硬盘中的文件至内存,因此将内存中的第四文件作为文件垃圾进行回收即可,无需反复写入相同的文件至硬盘。[0096]在第三种可能的情况,第四文件的重叠文件编号在合并前所对应的文件为空或未存储数据时,将内存中的第四文件写入硬盘的可用区域。[0097]关于合并和文件垃圾回收的详细内容参见上文描述和图4c,在此不再赘述。[0098]为了更好的说明上述层间重叠文件合并的流程,在一个具体的示例中,图6示出了一实施例提供的层间重叠文件合并方法的示例图。如图6所示,方法包括以下步骤:步骤61、在第i-1层的第二文件的数据数量满足第二阈值时,将第i-1层的第二文件的所有数据分别作为第一数据,第一数据具有第一数据标识。[0099]步骤62、对于每个第一数据,根据预设的映射函数和第i层的文件数目对第一数据标识进行映射,以确定第一数据标识在第i层的文件中的文件编号。[0100]步骤63、基于层间文件重叠关系,确定第i层中和第二文件存在重叠关系的重叠文件编号。[0101]步骤64、判断第i层是否存在第三文件,第三文件的文件编号为重叠文件编号且存储有数据,如果是,则执行步骤65,如果否,则执行步骤67。[0102]步骤65、基于各第一数据标识在第i层的文件中的文件编号,对各第三文件和第二文件进行合并,确定合并后的一个或多个第四文件,第四文件的文件编号为重叠文件编号。[0103]步骤66、对各第三文件和第二文件进行文件垃圾回收。[0104]步骤67、在完成各第一数据的映射后,将相同文件编号的第一数据批量存储至第i层的该文件编号对应的第一文件。[0105]以上针对任意的n层结构的数据存储的过程。可以理解,可以映射函数和层的文件数目,提高数据分割以及层间重叠文件合并中的重叠文件定位的效率;同时,并不限制文件的数据标识的数量,任意数据标识均可映射到不同层的文件,可以灵活的实现数据存储。[0106]以上即是对本方案中涉及的n层结构的存储方式。接下来基于上述n层结构的存储方式,介绍本方案提供的一种数据查询方法。详见下文描述。[0107]如图7所示,该方法包括以下步骤:步骤71,确定待查询的第一数据标识;步骤72,按照从上层到下层的顺序对n层进行逐层查询,其中针对任意当前层,根据预设的映射函数和当前层的文件数目对该数据标识进行映射,将映射结果作为当前层中待查询的文件编号,直到查找到第i层的第一文件编号,第i层的第一文件编号对应的第一文件存储第一数据标识对应的第一数据;步骤73,从第一文件中提取出第一数据。[0108]需要说明的是,在实际应用中,先查内存中的memtable,如果memtable中不存在数据,再查内存中的immmemtable,如果immmemtable中不存在数据,然后查level0层,如果level0层中不存在数据,则查询level1层;不断逐层查询,最早的数据在第i层。本说明实施例中,虽然数据都是分布在不同的层中,查询的过程可能需要跨层查询,但是对于每层的查询,由于通过映射函数进行计算,所以查询文件的时间为常量时间,可以大大提高文件定位的速度。[0109]另外,在定位了文件编号之后,需要判断该编号下是否存在文件,在判断存在文件后需要判断文件是否存在第一数据,如不存在,则查询下一层的文件。[0110]根据一种可能的实施方式,通过比对当前层的待查询的文件编号对应的文件所存储的数据标识和第一数据标识,从而判断待查询的文件编号对应的文件是否存在第一数据。[0111]根据一种可能的实施方式,映射函数包括第一函数和第二函数,根据第一函数将第一数据标识映射为第一映射数值,利用第二函数对当前层的文件数目和第一映射数值进行计算确定待查询的文件编号;在当前层存在待查询的文件编号对应的文件,则具体可通过如下方式判断待查询的文件编号对应的文件是否存在第一数据:确定当前层的待查询的文件编号对应的文件或当前层的一个或多个映射数值范围;若第一映射数值在映射数值范围之外,则判断文件不存在第一数据;否则,存在。[0112]值得注意的是,考虑到层的文件数目较多,同时,文件存储的数据的映射数值是不连续的,不便于建立索引以及管理维护;因此,优选当前层的映射数值范围,在实际应用中,可以建立层的映射数值范围索引,该索引用于说明层存储的所有数据的映射数值的范围,比如,可以包括一个或多个映射数值范围。[0113]需要说明的是,上述判断文件是否存在第一数据的方式仅仅作为示例,并不构成具体限定,比如,可以使用布隆过滤器。[0114]以上针对任意的n层结构的数据查询的过程。可以理解,可以预先设定的映射函数和层的文件数目,提高数据查询过程中文件定位的效率。[0115]根据另一方面的实施例,还提供了一种数据存储装置。图8示出根据一个实施例的数据存储装置的结构示意图,该装置可以部署在任何具有数据存储、计算、处理能力的设备、平台或设备集群中。该装置800部署在数据库引擎中,所述数据库引擎通过n层的结构以文件的形式存储数据,所述n为大于1的正整数,如图8所示,包括:数据确定模块81,配置为确定待存储至所述n层中第i层的第一数据,所述第一数据具有第一数据标识;映射模块82,配置为根据预设的映射函数和所述第i层的文件数目对所述第一数据标识进行映射,以确定所述第一数据标识在所述第i层的文件中的第一文件编号;存储模块83,配置为将所述第一数据存储至所述第一文件编号对应的第一文件中。[0116]在各个实施例中,上述各个模块具体的执行内容可以结合上述图8所示的步骤的详细内容,在此不复赘述。[0117]根据又一方面的实施例,还提供了一种数据查找装置。图9示出根据一个实施例的意图识别装置的结构示意图,该装置可以部署在任何具有数据存储、计算、处理能力的设备、平台或设备集群中。该装置900部署在数据库引擎中,所述数据库引擎通过n层的结构以文件的形式存储数据,如图9所示,包括:标识确定模块91,配置为确定待查询的第一数据标识;查找模块92,配置为按照从上层到下层的顺序对所述n层进行逐层查询,其中针对任意当前层,根据预设的映射函数和当前层的文件数目对所述第一数据标识进行映射,将映射结果作为当前层中待查询的文件编号,直到查找到第i层的第一文件编号,所述第i层的第一文件编号所对应的第一文件中存储有所述第一数据标识对应的第一数据;提取模块93,配置为从所述第一文件中提取出所述第一数据。[0118]在各个实施例中,上述各个模块具体的执行内容可以结合上述图6所示的步骤的详细内容,在此不复赘述。[0119]通过以上装置,可以预先设定的映射函数和层的文件数目,提高数据分割、数据查询过程中的文件定位以及层间合并时重叠文件定位的效率,同时,并不限制文件的数据标识的数量,任意数据标识均可映射到不同层的文件,可以灵活的实现数据存储。[0120]根据另一方面的实施例,还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行结合图5、图6或图7所描述的方法。[0121]根据再一方面的实施例,还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现结合图5、图6或图7所述的方法。[0122]本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。[0123]以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1