一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

数据存储及查询方法、装置及数据库系统与流程

2022-04-14 03:17:25 来源:中国专利 TAG:
1.本说明书实施例通常涉及数据存储领域,尤其涉及可适用于大value数据存储的数据存储方法及装置、数据查询方法及装置以及数据库系统。
背景技术
::2.在传统数据存储机制中,数据库系统会将待存储数据处理为key-value(kv)数据,并将kv数据存储到数据库系统中的内存层或数据存储介质中。为了提升数据写入性能,数据库系统采用分层组织方式对待存储数据进行数据组织,例如,采用类lsmtree的结构,然后将数据组织后的待存储数据划分到不同的数据存储文件中,并将不同的数据存储文件存储到内存层或数据存储介质的不同分层存储层中。例如,数据库系统计算待存储数据的key的哈希值,并根据所计算出的哈希值,将该key所对应的value划分到不同的哈希值范围(hashrange),然后基于hashrange将待存储数据划分至不同的数据存储文件中。3.在专利公开号为cn113407550a的发明专利申请案中公开了一种数据存储及查询方案。在该数据存储及查询方案中,在进行数据存储时,数据存储装置先将待存储数据存储在内存层并按照基于哈希的索引机制确定对应的数据索引。在内存层所存储数据满足预定条件后,将内存层的数据写入数据存储介质,按照基于完美哈希的索引机制生成对应的数据索引文件,并将数据索引文件加载到内存层。在进行数据查询时,数据查询装置先查询内存层的内存数据,在内存数据中不存在匹配结果时,在内存层中存储的数据存储介质的数据索引文件中进行索引查询,并根据查询到的数据索引向数据存储介质发起数据读取,由此获取对应的查询数据。4.然而,数据库系统可以支持多模态的哈希键值数据存储,例如,支持普通kv存储,也可以支持类似hbase的宽表数据存储,或者也可以通过将点和一度边的数据编码在一起组成一个值来支持图存储。5.当待存储数据中的value特别大时,例如当宽表的某个key包含了非常多的数据列(column),或者一个图节点有非常多的一度边(比如,一个名人明星可能有几千万或上亿支持者,这意味着这个图节点存在几千万或上亿条一度边)时,或者普通kv存储时自身value特别大。在这种情况下,如果简单地将value放在一起存储,查询时需要io读取的数据会非常大,从而给存储引擎服务端带来严重系统开销,同时造成较高的查询延迟,严重制约了数据查询性能。技术实现要素:6.鉴于上述,本说明书实施例提供数据存储及查询方案。在该数据存储及查询方案中,数据库系统包括内存层和具有分层存储结构的数据存储介质。在进行数据存储时,先将待存储数据存储在数据库系统的内存层中的内存表。在内存表被存满数据时,将内存表的存储数据逐层写入数据存储介质。在针对数据存储介质逐层写入时,对待写入存储数据与当前分层存储层的数据存储文件中的全部存储数据进行数据合并;将合并后的存储数据的value切分为主数据块以及对应的附加数据块,并确定出各个主数据块以及对应附加数据块在数据存储介质的存储位置,然后将各个主数据块以及对应附加数据块存储到数据存储介质的对应存储位置。在进行数据查询查询时,自数据库系统的内存层起逐层进行数据查询。按照这种数据存储及查询方案,通过将大value切分成多个数据块存储到数据存储文件中,在数据查询时根据查询条件和主数据块中的元数据信息,按需读取附加数据块,从而提高大value数据的存储和查询效率,降低数据库系统的系统开销(io开销)。7.根据本说明书实施例的一个方面,提供一种数据存储方法,包括:将待存储数据写入数据库系统的内存层的内存表,所述待存储数据包括key-value对中的value;响应于所述内存表写满,自所述数据库系统的数据存储介质的存储层中的顶层分层存储层开始,按照下述方式对所述内存表的存储数据逐层执行数据写入,直到不再触发下层数据写入:读取当前分层存储层的数据存储文件中的全部存储数据;将所写入的上层存储数据与所读取的存储数据合并;将合并后的存储数据中与每个key对应的value切分为主数据块以及对应的附加数据块;分别基于各个主数据块所对应的key的普通哈希值和完美哈希值,确定各个主数据块所在数据存储文件以及各个主数据块在所在数据存储文件中的偏移量,每个数据存储文件对应一个基于key的普通哈希值的哈希值范围;以及根据所确定出的所在数据存储文件以及在所在数据存储文件中的偏移量,对各个主数据块以及对应的附加数据块进行数据写入,所写入的每个主数据块包括元数据,所述元数据包括附加数据块个数、各个附加数据块在数据存储文件中的偏移量和数据长度。8.可选地,在上述方面的一个示例中,各个主数据块中的一个或多个主数据块不包括对应的附加数据块,以及针对不包括附加数据块的主数据块,在写入数据存储文件时不包括元数据。9.可选地,在上述方面的一个示例中,所述下层数据写入响应于所述当前分层存储层中的一个或多个数据存储文件在完成当前数据写入后的文件大小达到或超过预定阈值而触发,所写入的存储数据包括所述当前分层存储层中达到或超过所述预定阈值的数据存储文件中的存储数据。10.可选地,在上述方面的一个示例中,所述数据存储文件中的附加数据块被连续存储或分开存储。11.可选地,在上述方面的一个示例中,所述合并后的存储数据按照下述数据切分算法中的一种数据切分算法执行数据切分:基于数据查询频次的数据切分算法;基于原始数据表中的数据列的数据切分算法;基于数据时间戳范围的数据切分算法;基于边类型、边数量或边索引的图数据切分算法。12.可选地,在上述方面的一个示例中,所述数据存储介质的存储层的分层层数包括预定层数,和/或各个分层存储层分别包括预定数目个数据存储文件。13.可选地,在上述方面的一个示例中,各个分层存储层所包括的数据存储文件数目自上而下逐层增加。14.根据本说明书的实施例的另一方面,提供一种数据查询方法,包括:响应于接收到用户发起的数据查询请求,在数据库系统的内存层的内存表中进行数据查询,所述数据库系统按照如上所述的数据存储方法进行数据存储;响应于针对所述内存层的数据查询结果未完全满足所述数据查询请求中的数据查询条件,自所述数据库系统的存储层的顶层分层存储层开始,按照下述方式执行数据查询,直到完全满足所述数据查询条件或者完成底层分层存储层查询:响应于针对所述内存层或上层分层存储层的数据查询结果未完全满足所述数据查询条件,根据所述数据查询请求的目标数据的key的普通哈希值定位当前分层存储层中的数据存储文件以及根据所述key的完美哈希值定位主数据块在数据存储文件中的偏移量和数据长度;基于所定位的主数据块的偏移量和数据长度,从所在数据存储文件中读取主数据块;对所读取的主数据块进行解析以获取数据查询结果;响应于针对所述主数据块的数据查询结果未完全满足所述数据查询条件,获取所述主数据块中记录的附加数据块的偏移量和数据长度;基于所获取的附加数据块的偏移量和数据长度,从所在数据存储文件中读取所有附加数据块;对所读取的各个附加数据块进行解析以获取数据查询结果;以及将所得到的所有数据查询结果提供给所述用户。15.可选地,在上述方面的一个示例中,各个附加数据块的数据读取并行执行。16.根据本说明书的实施例的另一方面,提供一种数据存储装置,包括:内存写入单元,将待存储数据写入数据库系统的内存层的内存表,所述待存储数据包括key-value对中的value;以及数据存储介质写入单元,响应于所述内存表写满,将所述内存表的存储数据写入所述数据库系统的数据存储介质,其中,所述数据存储写入单元包括:数据读取模块,读取当前分层存储层的数据存储文件中的全部存储数据;数据合并模块,将所写入的上层存储数据与所读取的存储数据合并;数据切分模块,将合并后的存储数据中与每个key对应的value切分为主数据块以及对应的附加数据块;存储位置确定模块,分别基于各个主数据块所对应的key的普通哈希值和完美哈希值,确定各个主数据块所在数据存储文件以及各个主数据块在所在数据存储文件中的偏移量,每个数据存储文件对应一个基于key的普通哈希值的哈希值范围;以及数据写入模块,根据所确定出的所在数据存储文件以及在所在数据存储文件中的偏移量,对各个主数据块以及对应的附加数据块进行数据写入,所写入的每个主数据块包括元数据,所述元数据包括附加数据块个数、各个附加数据块在数据存储文件中的偏移量和数据长度,其中,所述数据存储写入单元自所述数据库系统的数据存储介质的存储层中的顶层分层存储层开始,对所述内存表的存储数据执行逐层数据写入,直到不再触发下层数据写入。17.可选地,在上述方面的一个示例中,所述数据存储介质写入单元响应于所述当前分层存储层中的一个或多个数据存储文件的文件大小达到或超过预定阈值,对所述当前分层存储层中达到或超过所述预定阈值的数据存储文件中的存储数据执行下层数据写入。18.可选地,在上述方面的一个示例中,所述数据切分模块按照下述数据切分算法中的一种数据切分算法对所述合并后的存储数据执行数据切分:基于数据查询频次的数据切分算法;基于原始数据表中的数据列的数据切分算法;基于数据时间戳范围的数据切分算法;基于边类型、边数量或边索引的图数据切分算法。19.可选地,在上述方面的一个示例中,所述数据存储介质的存储层的分层层数包括预定层数,和/或各个分层存储层分别包括预定数目个数据存储文件。20.可选地,在上述方面的一个示例中,各个分层存储层所包括的数据存储文件数目自上而下逐层增加。21.根据本说明书的实施例的另一方面,提供一种数据查询装置,包括:内存查询单元,响应于接收到用户发起的数据查询请求,在数据库系统的内存层的内存表中进行数据查询,所述数据库系统按照如上所述的数据存储方法进行数据存储;数据存储介质查询单元,响应于针对所述内存层的数据查询结果未完全满足所述数据查询请求中的数据查询条件,对所述数据库系统的数据存储介质进行数据查询:以及查询结果提供单元,将所得到的所有数据查询结果提供给所述用户,其中,所述数据存储介质查询单元包括:主数据块定位模块,响应于针对所述内存层或上层分层存储层的数据查询结果未完全满足所述数据查询条件,根据所述数据查询请求的目标数据的key的普通哈希值定位当前分层存储层中的数据存储文件以及根据所述key的完美哈希值定位主数据块在数据存储文件中的偏移量和数据长度;主数据块读取模块,基于所定位的主数据块的偏移量和数据长度,从所在数据存储文件中读取主数据块;主数据块查询模块,对所读取的主数据块进行解析以获取数据查询结果;附加数据块定位模块,响应于针对所述主数据块的数据查询结果未完全满足所述数据查询条件,获取所述主数据块中记录的附加数据块的偏移量和数据长度;附加数据块读取模块,基于所获取的附加数据块的偏移量和数据长度,从所在数据存储文件中读取所有附加数据块;附加数据块查询模块,对所读取的各个附加数据块进行解析以获取数据查询结果;其中,所述数据存储介质查询单元自所述数据库系统的存储层的顶层分层存储层开始执行数据查询,直到完全满足所述数据查询条件或者完成底层分层存储层查询。22.可选地,在上述方面的一个示例中,所述附加数据块读取模块从所在数据存储文件中并行读取各个附加数据块。23.根据本说明书的实施例的另一方面,提供一种数据库系统,包括:如上所述的数据存储装置;如上所述的数据查询装置;内存层;以及数据存储介质。24.根据本说明书的实施例的另一方面,提供一种数据存储装置,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器中的计算机程序,所述至少一个处理器执行所述计算机程序来实现如上所述的数据存储方法。25.根据本说明书的实施例的另一方面,提供一种计算机可读存储介质,其存储有可执行指令,所述指令当被执行时使得处理器执行如上所述的数据存储方法。26.根据本说明书的实施例的另一方面,提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行来实现如上所述的数据存储方法。27.根据本说明书的实施例的另一方面,提供一种数据查询装置,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器中的计算机程序,所述至少一个处理器执行所述计算机程序来实现如上所述的数据查询方法。28.根据本说明书的实施例的另一方面,提供一种计算机可读存储介质,其存储有可执行指令,所述指令当被执行时使得处理器执行如上所述的数据查询方法。29.根据本说明书的实施例的另一方面,提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行来实现如上所述的数据查询方法。附图说明30.通过参照下面的附图,可以实现对于本说明书内容的本质和优点的进一步理解。在附图中,类似组件或特征可以具有相同的附图标记。31.图1示出了根据本说明书的实施例的数据库系统的示例示意图。32.图2示出了根据本说明书的实施例的数据存储介质的示例示意图。33.图3示出了根据本说明书的实施例的数据存储文件的示例示意图。34.图4示出了根据本说明书的实施例的数据存储方法的示例流程图。35.图5示出了根据本说明书的实施例的针对数据存储介质的逐层数据写入方法的示例流程图。36.图6示出了根据本说明书的实施例的待存储的原始数据的示例示意图。37.图7示出了根据本说明书的实施例的数据合并过程的示例流程图。38.图8示出了根据本说明书的实施例的数据查询方法的示例流程图。39.图9示出了根据本说明书的实施例的数据存储装置的示例方框图。40.图10示出了根据本说明书的实施例的数据查询装置的示例方框图。41.图11示出了根据本说明书的实施例的基于计算机系统实现的数据存储装置的示例示意图。42.图12示出了根据本说明书的实施例的基于计算机系统实现的数据查询装置的示例示意图。具体实施方式43.现在将参考示例实施方式讨论本文描述的主题。应该理解,讨论这些实施方式只是为了使得本领域技术人员能够更好地理解从而实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者示例的限制。可以在不脱离本说明书内容的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个示例可以根据需要,省略、替代或者添加各种过程或组件。例如,所描述的方法可以按照与所描述的顺序不同的顺序来执行,以及各个步骤可以被添加、省略或者组合。另外,相对一些示例所描述的特征在其它例子中也可以进行组合。44.如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其他实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其他的定义,无论是明确的还是隐含的。除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。45.在结合附图描述根据本说明书的实施例之前,先对本说明书的实施例中提及的几个术语进行简要说明。46.普通哈希运算是指利用普通哈希函数来对数据进行哈希运算。按照普通哈希函数进行哈希运算可能会出现哈希冲突(hashcollision)。换言之,针对两个不同数据,按照普通哈希函数进行哈希运算可能会得到相同哈希值。47.完美哈希运算是一种不会出现哈希冲突的哈希运算,其基于完美哈希函数(perfecthashfunction)将n个输入整数数据集映射到m个整数空间,其中,。在完美哈希运算时,对于给定的数据集,任意的key1和key2,经过完美哈希函数h的处理后所得到的哈希值都不相同,即,。48.在本说明书中,原始数据被处理为键值对(key-value,kv)数据,并且将各个key对应的value存储到数据库系统中。原始数据的示例可以包括但不限于普通kv数据,宽表数据,图数据等。针对普通kv数据,每个key对应一个value。对于宽表数据和图数据处理后的kv数据,对于一个key可能会存在多个数据列(column),或者一个图节点存在多条一度边,换言之,一个key可以对应多个value。在本说明书中,待存储数据包括kv数据中的value,其指代要存储到数据库系统中的数据。49.下面将参照附图描述根据本说明书的实施例的数据库系统、数据存储方法、数据存储装置、数据查询方法及数据查询装置。50.图1示出了根据本说明书的实施例的数据库系统100的示例示意图。数据库系统100也可以称为数据库应用的服务端,用于提供数据存储服务和数据查询服务。数据库系统100例如可以利用具有计算能力的设备实现。51.如图1所示,数据库系统100包括内存层110和数据存储介质120。内存层110可以包括由至少一个内存(例如,计算机设备的内存)组成的内存池。内存层110也可以称为内存储器和主存储器。内存层110例如可以用于暂时存放计算设备的cpu中的运算数据以及与例如磁盘(disk)等外部数据存储介质交换的数据。数据存储介质120也可以称为外部存储器。在计算设备读取数据存储介质120中的数据时,需要通过向数据存储介质发起例如io操作的数据读取操作来将数据存储介质120中的数据读取到内存中。数据存储介质120例如可以是各种非易失性存储介质,比如,磁盘设备、存储卡等。磁盘是指利用磁记录技术存储数据的存储器。磁盘的示例例如可以包括各种形式的(softdisk)软盘和硬盘(harddisk)。52.数据库系统100还包括数据存储装置130。数据存储装置130被配置为将待存储数据存储到数据库系统的内存层110或者数据存储介质120。53.数据库系统100还包括数据查询装置140。数据查询装置140被配置为响应于用户发起的数据查询请求在数据库系统的内存层110或者数据存储介质120中进行数据查询,并将数据查询结果提供给用户。54.在本说明书的一些实施例中,数据存储介质可以被分层为至少两个分层存储层,该至少两个分层存储层中的各个分层存储层之间构成层次关系,由此构成分层存储层结构。图2示出了根据本说明书的实施例的数据存储介质120的示例示意图。55.如图2所示,数据存储介质120被分层为3个分层存储层,即,分层存储层l0、分层存储层l1和分层存储层l2。分层存储l0是分层存储层结构的顶层存储层,分层存储层l1是分层存储层l0的下层分层存储层,以及分层存储层l2是分层存储层l1的下层分层存储层。要说明的是,分层存储层结构的分层层数可以是预先设置的预定数目层。56.各个分层存储层可以包括预定数目个数据存储文件(例如,bin文件)。在一些实施例中,各个分层存储层的数据存储文件个数可以相同。在一些实施例中,各个分层存储层的数据存储文件个数可以不同。例如,在一些示例中,在对数据存储介质进行分层时,为各个分层存储层设置的数据存储文件个数可以自顶层分层存储层开始逐层依序增加。如图2所示,为分层存储l0、分层存储层l1和分层存储层l2设置的bin文件的个数自顶层存储层l0起自上向下依序增加,即,分层存储层l0包含1个bin文件,分层存储层l0包含2个bin文件,以及分层存储层l2包含4个bin文件。要说明的是,图2示出的仅仅是数据存储介质的分层存储结构的示例。在其他实施例中,可以采用包含其它数目个数据存储文件的分层存储结构。优选地,每个分层存储层所包含的数据存储文件的个数可以为2的幂数。57.分层存储层中的数据存储文件用于存储待存储数据的value。在将待存储数据的value写入数据存储文件时,需要将待存储数据中每个key所对应的value切分为主数据以及对应的附加块数据,并且基于该key确定所对应的value在数据存储文件中的存储位置(即,相对于数据存储文件首地址的偏移量)。然后,将所切分出的主数据以及对应的附加块数据写入对应的数据存储文件中。58.图3示出了根据本说明书的实施例的数据存储文件的示例示意图。59.在图3的示例中,数据存储文件包括多个主数据块,例如,主数据块1、主数据块2到主数据块m。每个主数据块对应一个key的部分或全部value。可选地,每个主数据块还可以包括一个或多个附加数据块。例如,主数据块1可以包括附加数据块1、附加数据块2到附加数据块n。附加数据块1到n用于存储其主数据块所对应的key的剩余value。换言之,对于待存储数据中的一个key的value,可以将其切分为一个主数据块以及一个或多个附加数据块。在一个key的value不大的情况下,可以将其所有value切分为主数据块,而无需附加数据块。60.要说明的是,在本说明书的数据存储文件中,如图3所示,各个key所对应的主数据块被连续存储,并且各个key所对应的主数据块在数据存储文件中的存储位置可以基于该key的完美哈希值确定。此外,各个主数据块的对应附加数据块可以被连续存储,如图3中所示,也可以分开存储。61.在写入数据存储文件时,主数据块除了记录所包含的子数据块之外,还需要包含对应的元数据(如果存在附加数据块)。元数据包括附加数据块个数、各个附加数据块在数据存储文件中的偏移量和数据长度。如图3所示,针对主数据块1,其包括n个附加数据块,从而其附加数据块个数为n。此外,元数据还记录附加数据块1到n在数据存储文件中的偏移量以及对应的数据长度。元数据中记录的附加数据块的偏移量用于指示附加数据块在数据存储文件中的存储位置的首地址相对于数据存储文件的首地址的偏移量。各个附加数据块被记录到数据存储文件的相应位置处,所记录的附加数据块可以包含1个或多个子数据块。例如,附加数据块1包含子数据块x 1到子数据块x y。62.图4示出了根据本说明书的实施例的数据存储方法的示例流程图。图4中示出的数据存储方法可以由数据库系统中的数据存储装置130执行。在一些实施例中,数据存储装置130可以被实现为数据库系统(数据库应用服务端)的用于实现数据存储的线程(下文中称为数据存储线程)。63.如图4所示,在需要将待存储数据写入数据库系统时,将待存储数据写入数据库系统的内存层的内存表(memtable)。例如,在410,数据存储线程监测是否接收到待存储数据。待存储数据例如可以是用户经由数据库应用的客户端设备输入的待存储数据。如果未接收到待存储数据,则数据存储线程持续进行监测。如果接收到待存储数据,则在420,数据存储线程将待存储数据写入内存表memtable。64.图6示出了根据本说明书的实施例的待存储的原始数据的示例示意图。如图6所示,待存储的原始数据是键值对数据。每条键值对数据可以包括由1个键(key)和至少一个值(value)组成的键值对(即,key-value)。在图3的示例中,每条键值对数据的key为数据id,例如,用户的身份证号码、注册号码、系统编号等。value_1表示用户姓名,value_2表示用户年龄,以及value_5表示用户职业等。在本说明书中,术语“待存储数据”是指原始数据中的value。65.在430,判断内存层中的内存表是否写满。如果判断为内存表写满,则在440,自数据库系统的数据存储介质的存储层中的顶层分层存储层开始,按照逐层写入方式将内存表的存储数据写入数据存储介质的存储层。如果判断为内存表未写满,则当前数据存储过程结束。可选地,可以返回到410,继续监测是否接收到待存储数据。66.图5示出了根据本说明书的实施例的针对数据存储介质的逐层数据写入方法500的示例流程图。图5示出的示例是逐层数据写入过程的当前分层存储层的数据写入过程。67.如图5所示,在触发针对当前分层存储层的数据写入时,在510,读取当前分层存储层的所有存储数据,即,当前分层存储层中的所有数据存储文件(bin文件)中的存储数据。数据写入可以响应于内存表写满或者上层分层存储层中的一个或多个数据存储文件的文件大小达到或超过预定阈值而触发。所写入的存储数据包括内存表的存储数据或者上层分层存储层中达到或超过预定阈值的数据存储文件中的存储数据。68.在520,将所写入的存储数据与所读取的当前分层存储层中的存储数据合并。图7示出了根据本说明书的实施例的数据合并过程的示例流程图。如图7所示,在进行数据合并时,对于同一key,如果value的取值发生更新,则使用新数据来替换旧数据,比如,id1所对应的数据。或者,如果第一数据具有旧数据中不存在的key,则增加该key所对应的数据,比如,id5所对应的数据。然后,基于内存层中的更新后的存储数据,使用基于哈希的第一索引机制来生成对应的内存数据索引。69.在530,将合并后的存储数据切分为各个主数据块以及对应的附加数据块。例如,可以每个key所对应的存储数据切分为主数据块以及对应的附加数据块。70.在一些实施例中,可以按照数据切分算法对合并后的存储数据执行数据切分。数据切分算法的示例可以包括但不限于:基于数据使用频次的数据切分算法;基于原始数据表中的数据列的数据切分算法;基于数据时间戳范围的数据切分算法;基于边类型、边数量或边索引的图数据切分算法。71.基于数据使用频次的数据切分算法是指根据value是否是常用value进行的数据切分。value是否是常用value可以基于本领域的各种适用方法来确定,例如,可以通过数据查询命中频次(或数据使用频次)是否超过预定值来确定。按照这种数据切分算法,可以将常用value存储在主数据块,而将不常用value存储到附加数据块,由此使得大部分数据查询可以避免读取附加数据块。72.基于原始数据表中的数据列的数据切分算法是指基于原始数据表(例如,宽表)中的数据列进行的数据切分。例如,针对具有大value的宽表,可以按照宽表的column来进行数据切分。基于数据时间戳范围的数据切分算法是指基于待存储数据的时间戳进行的数据切分。按照这种数据切分方法,每个数据块包含一定时间戳范围内的存储数据。基于边类型、边数量或边索引的图数据切分算法是适用于图数据的数据切分算法。在这种数据切分算法中,可以按照边的类型、边的数量或者边索引来对图数据进行数据切分。73.在540,分别基于各个主数据块所对应的key的普通哈希值和完美哈希值,确定各个主数据块所在数据存储文件以及各个主数据块在所在数据存储文件中的偏移量。每个数据存储文件对应一个哈希值范围。74.在本说明书中,每个分层存储层被设置为对应一个第一哈希值范围,该第一哈希值范围例如可以是一个整数范围,比如,[0,k-1],其中,k为2的幂数。每个分层存储层中的各个数据存储文件所对应的哈希值范围为该分层存储层的哈希值范围除以该分层存储层的数据存储文件个数。例如,针对图2中的数据存储介质,分层存储层l0中的数据存储文件的哈希值范围为[0,k-1],分层存储层l1中的2个数据存储文件的哈希值范围分别为[0,k/2-1]和[k/2,k-1],以及分层存储层l1中的4个数据存储文件的哈希值范围分别为[0,k/4-1],[k/4,k/2-1],[k/2,3k/4-1]和[3k/4,k-1]。[0075]在进行存储位置确定时,首先,基于各个主数据块所对应的key的普通哈希值,确定各个主数据块所在数据存储文件。例如,计算各个主数据块所对应的key的普通哈希值,然后基于主数据块所对应的key的普通哈希值,确定该普通哈希值所在的哈希值范围,由此确定出所在数据存储文件。针对各个主数据块,如果基于普通哈希运算所计算出的哈希值超出所设置的第一哈希值范围(即,分层存储层所对应的哈希值范围),则以第一哈希值范围的哈希值个数为模进行取模运算,所得到的余数为普通哈希值。在确定出各个主数据块所在数据存储文件后,针对每个数据存储文件,基于该数据存储文件中包含的所有主数据块的key,确定出该数据存储文件所对应的完美哈希函数,并利用所确定出的完美哈希函数来对该数据存储文件中的各个主数据块的key进行完美哈希运算,由此确定出各个主数据块在所在数据存储文件中的偏移量。[0076]在如上确定出各个主数据块的存储位置后,在550,根据所确定出的所在数据存储文件以及在所在数据存储文件中的偏移量,对各个主数据块以及对应的附加数据块进行数据写入。在所写入的主数据块还包括一个或多个附加数据块时,所写入的主数据块还包括元数据,所述元数据包括附加数据块个数、各个附加数据块在数据存储文件中的偏移量和数据长度,由此,利用元数据定位各个附加数据块的存储位置并进行附加数据块写入。[0077]可选地,在将内存表的存储数据写入数据存储介质的存储层后,可以从内存表中删除相应存储数据,由此释放内存层中的相应存储空间。此外,可选地,在分层存储层的存储数据被写入到下层分层存储层后,也可以从该分层存储层中删除对应的存储数据。[0078]回到图5,在如上完成主数据块及其对应附加数据块的数据写入后,在560,判断是否触发下层数据写入。例如,判断当前分层存储层中的一个或多个数据存储文件的文件大小是否达到或超过预定阈值。如果当前分层存储层中的一个或多个数据存储文件的文件大小达到或超过预定阈值,则触发下层数据写入,即,对当前分层存储层中文件大小达到或超过预定阈值的一个或多个数据存储文件的存储数据执行下层数据写入。如果当前分层存储层中的所有数据存储文件的文件大小都未达到预定阈值,则数据存储过程结束。[0079]下面以一个示例为例说明根据本说明书的实施例的数据存储过程。在该示例中,数据库系统包括内存和硬盘,硬盘分为l0-l3层级。内存、l0层和l1层存储有数据。所存储的存储数据为用户信息系统中的用户数据,其中,key为用户id,value为用户的各种信息。针对用户id1,内存中记录了用户id1的名字,l0层中记录了用户id1的地址,以及l1层中记录了用户id1的电话号码。[0080]假设需要插入用户id1的身份证号。内存表中的数据使用链表存储,由此在内存表中插入用户id1的身份证号后,用户id1的链表将存在两项信息,一项信息是新插入的身份证号,一项信息是原来保存的名字。[0081]如果插入身份证号后内存表存满,则需要将内存表的存储数据合并到l0层的bin文件中。在这种情况下,需要从l0层中读取l0层的bin文件中存储的旧数据(例如,电话号码等子数据),将所读取的电话号码与内存表的存储数据(例如,用户id1的身份证、名字等子数据)合并,并将合并后的数据写入l0层的新bin文件中。电话号码、身份证和名字等子数据可以一起放入bin文件的主数据块中,也可以分开放在bin文件的主数据块和附加数据块中。例如,名字是最常访问的子数据,身份证号和电话号码是不常用的子数据,则可以将名字放在主数据块中,以及将身份证号、电话号码分别放在2个附加块中。此外,在子数据太多的情况下,如果放在一个主数据块中,则会使得主数据块太大,由此可以将这些子数据切分成大小合适的主块和附加块。这里,主数据块和附加数据块的数据切分方式可以是自定义方式。[0082]在完成内存表到l0层的数据写入后,如果l0层的bin文件大小达到预定阈值,则需要将l0层的bin文件与l1层的bin文件合并,并写入l1层中由此得到l1层的新bin文件。l1层的数据写入过程与上面l0层的数据写入过程类似,在此不再赘述。[0083]如上参照附图描述了根据本说明书的实施例的数据存储过程。在按照上述数据存储方法将数据存储到数据库系统中后,可以响应于用户发起的数据查询请求来进行数据查询。[0084]图8示出了根据本说明书的实施例的数据查询方法800的示例流程图。图8中的数据查询方法可以由数据库系统中的数据查询装置执行。数据查询装置可以被实现为数据库系统(数据库应用服务端)的用于实现数据查询的线程(下文中称为数据查询线程)。[0085]如图8所示,在810,响应于接收到用户发起的数据查询请求,在数据库系统的内存层的内存表中进行数据查询。在一个示例中,数据查询请求可以包括待查询目标数据的key以及数据查询条件。[0086]在完成针对内存表的数据查询得到针对内存表的数据查询结果后,在820,判断针对内存表的数据查询是否完全满足数据查询请求中的数据查询条件。即,判断数据查询请求中需要查询的数据查询条件是否都完成了对应的数据查询。例如,假设内存层的内存表中仅仅存储用户id1的身份证、名字,而数据查询条件指示需要查询用户id1的身份证、名字和注册日期,则由于内存表中没有注册日期,从而针对内存表的数据查询未完全满足数据查询请求中的数据查询条件。[0087]如果针对内存表的数据查询完全满足数据查询请求中的数据查询条件,则在811,将针对内存表的数据查询得到的数据查询结果提供给用户。[0088]如果针对内存表的数据查询未完全满足数据查询请求中的数据查询条件,则自数据库系统的存储层的顶层分层存储层开始,逐层执行数据查询,直到完全满足数据查询条件或者完成底层分层存储层查询。具体地,循环执行块803到810的操作。[0089]在803,针对当前分层存储层,根据数据查询请求的待查询目标数据的key的普通哈希值定位当前分层存储层中的数据存储文件,并且根据待查询目标数据的key的完美哈希值定位主数据块在数据存储文件中的偏移量和数据长度。[0090]例如,通过使用对目标数据的key执行普通哈希运算得到普通哈希值,然后确定普通哈希值落在当前分层存储层的哪个数据存储文件的哈希值范围内,由此定位出目标数据所在的数据存储文件。在定位出所在的数据存储文件后,基于该数据存储文件所对应的完美哈希函数,对目标数据的key执行完美哈希运算得到完美哈希值,由此定位出主数据块在数据存储文件中的偏移量,并基于下一主数据块在数据存储文件中的偏移量确定出该主数据块的数据长度。要说明的是,在进行数据存储时,由于各个主数据块的key已知并且连续存储,从而可以获悉各个主数据块的偏移量。[0091]在定位出主数据块在数据存储文件中的偏移量和数据长度后,在804,基于所定位出的主数据块的偏移量和数据长度,从所在数据存储文件中读取主数据块。例如,数据查询线程可以设置主数据块的回调函数,并向操作系统发送异步io读取请求,由操作系统向数据存储介质发起io数据读取操作,由此从数据存储介质的对应分层存储层的数据存储文件中读取主数据块。[0092]在从数据存储介质读取主数据块后,在805,对所读取的主数据块进行解析,并在解析后的主数据块中进行数据查询以获取数据查询结果。[0093]在得到针对主数据块的数据查询结果后,在806,判断完成主数据块的数据查询后是否完全满足数据查询请求中的数据查询条件。如果完成主数据块的数据查询后完全满足数据查询请求中的数据查询条件,则在811,将针对内存表以及主数据块的数据查询得到的数据查询结果提供给用户。[0094]如果完成主数据块的数据查询后未完全满足数据查询请求中的数据查询条件,则在807,获取主数据块中记录的附加数据块的偏移量和数据长度。即,从解析后的主数据块中获取各个附加数据块的偏移量和数据长度。[0095]在808,基于所获取的各个附加数据块的偏移量和数据长度,从所在数据存储文件中读取所有附加数据块。例如,在判断为需要执行附加数据块查询后,数据查询线程可以设置附加数据块的回调函数,根据主数据块中记录的附加数据块的偏移量和数据长度,针对每个附加数据块,向操作系统发送io读取请求,由操作系统向数据存储介质发起io数据读取操作来从数据存储介质读取附加数据块。在当前分层存储层的附加数据块被操作系统返回后,数据查询线程调用附加数据块的回调函数执行处理。例如,附加数据块的回调函数可以对返回的附加数据块的数目计数,当所有附加数据块都返回后,开始解码处理所有附加数据块。要说明的是,在一个示例中,各个附加数据块的数据读取可以并行执行。[0096]在809,对所读取的各个附加数据块进行解析以获取数据查询结果。对所读取的附加数据块进行解析,并在解析后的附加数据块中进行数据查询以获取数据查询结果。[0097]在得到针对附加数据块的数据查询结果后,在810,判断完成附加数据块的数据查询后是否完全满足数据查询请求中的数据查询条件。如果完成附加数据块的数据查询后完全满足数据查询请求中的数据查询条件,则在811,将针对内存表、主数据块以及附加数据块的数据查询得到的数据查询结果提供给用户。这里,针对主数据块以及附加数据块的数据查询结果包括直到当前分层存储层为止(包括当前分层存储层)的所有分层存储层的主数据块以及附加数据块的数据查询结果。[0098]如果完成附加数据块的数据查询后未完全满足数据查询请求中的数据查询条件,则返回到803,针对下一分层存储层执行803到810的数据查询处理。[0099]利用上述数据存储及数据查询方案,由于在每个分层存储层中,同一key的value可以分开存储在主数据块以及一个或多个附加数据块,并且在进行数据查询时,首先在主数据块中进行查询,只有在主数据块中不存在目标数据时才执行针对附加数据块的数据查询,即,针对附加数据块实行按需查询,从而可以降低数据查询时的数据查询量,由此提升数据查询效率。[0100]图9示出了根据本说明书的实施例的数据存储装置900的示例方框图。如图9所示,数据存储装置900可以包括内存写入单元910和数据存储介质写入单元920。数据存储介质写入单元920包括数据读取模块921、数据合并模块923、数据切分模块925、存储位置确定模块927和数据写入模块929。[0101]内存写入单元910被配置为将待存储数据写入数据库系统的内存层的内存表,所述待存储数据包括key-value对。内存写入单元910的操作可以参考上面参照图4的420描述的操作。[0102]数据存储介质写入单元920被配置为响应于内存表写满,将内存表的存储数据写入数据库系统的数据存储介质。具体地,数据存储写入单元920中的数据读取模块921、数据合并模块923、数据切分模块925、存储位置确定模块927和数据写入模块929,自数据库系统的数据存储介质的存储层中的顶层分层存储层开始,对内存表的存储数据执行逐层数据写入,直到不再触发下层数据写入。[0103]数据读取模块921被配置为读取当前分层存储层的数据存储文件中的全部存储数据。数据合并模块923被配置为将所写入的上层存储数据与所读取的存储数据合并。[0104]数据切分模块925被配置为将合并后的存储数据中与每个key对应的value切分为主数据块以及对应的附加数据块。[0105]存储位置确定模块927被配置为分别基于各个主数据块所对应的key的普通哈希值和完美哈希值,确定各个主数据块所在数据存储文件以及各个主数据块在所在数据存储文件中的偏移量,每个数据存储文件对应一个哈希值范围。[0106]数据写入模块929被配置为根据所确定出的所在数据存储文件以及在所在数据存储文件中的偏移量,对各个主数据块以及对应的附加数据块进行数据写入,所写入的每个主数据块包括元数据,所述元数据包括附加数据块个数、各个附加数据块在数据存储文件中的偏移量和数据长度。[0107]在一些实施例中,数据存储介质写入单元920可以响应于当前分层存储层中的一个或多个数据存储文件的文件大小达到或超过预定阈值,对当前分层存储层中达到或超过预定阈值的数据存储文件中的存储数据执行下层数据写入。[0108]在一些实施例中,数据切分模块925可以被配置为按照下述数据切分算法中的一种数据切分算法对所述合并后的存储数据执行数据切分:基于数据使用频次的数据切分算法;基于原始数据表中的数据列的数据切分算法;基于数据时间戳范围的数据切分算法;基于边类型、边数量或边索引的图数据切分算法。[0109]图10示出了根据本说明书的实施例的数据查询装置1000的示例方框图。如图10所示,数据查询装置1000包括内存查询单元1010、数据存储介质查询单元1020和查询结果提供单元1030。数据存储介质查询单元1020包括主数据块定位模块1021、主数据块读取模块1022、主数据块查询模块1023、附加数据块定位模块1024、附加数据块读取模块1025和附加数据块查询模块1026。[0110]内存查询单元1010被配置为响应于接收到用户发起的数据查询请求,在数据库系统的内存层的内存表中进行数据查询。内存查询单元1010的操作可以参考上面参照图8的801描述的操作。[0111]数据存储介质查询单元1020被配置为响应于针对内存层的数据查询结果未完全满足所述数据查询请求中的数据查询条件,对数据库系统的数据存储介质进行数据查询。数据存储介质查询单元1020自数据库系统的存储层的顶层分层存储层开始执行数据查询,直到完全满足数据查询条件或者完成底层分层存储层查询。[0112]具体地,在针对每个分层存储层进行数据查询时,主数据块定位模块1021、主数据块读取模块1022、主数据块查询模块1023、附加数据块定位模块1024、附加数据块读取模块1025和附加数据块查询模块1026执行下述操作。[0113]主数据块定位模块1021被配置为响应于针对内存层或上层分层存储层的数据查询结果未完全满足数据查询条件,根据数据查询请求的目标数据的key的普通哈希值定位当前分层存储层中的数据存储文件,以及根据目标数据的key的完美哈希值定位主数据块在数据存储文件中的偏移量和数据长度。主数据块读取模块1022被配置为基于所定位的主数据块的偏移量和数据长度,从所在数据存储文件中读取主数据块。主数据块查询模块1023被配置为对所读取的主数据块进行解析以获取数据查询结果。[0114]附加数据块定位模块1024被配置为响应于针对主数据块的数据查询结果未完全满足数据查询条件,获取主数据块中记录的附加数据块的偏移量和数据长度。附加数据块读取模块1025被配置为基于所获取的附加数据块的偏移量和数据长度,从所在数据存储文件中读取所有附加数据块。附加数据块查询模块1026被配置为对所读取的各个附加数据块进行解析以获取数据查询结果。[0115]查询结果提供单元1030被配置为将所得到的所有数据查询结果提供给用户。[0116]如上参照图1到图10,对根据本说明书实施例的数据存储方法、数据存储装置、数据查询方法、数据查询装置以及数据库系统进行了描述。上面的查询存储装置和数据查询装置可以采用硬件实现,也可以采用软件或者硬件和软件的组合来实现。[0117]图11示出了根据本说明书的实施例的基于计算机系统实现的数据存储装置1100的示意图。如图11所示,数据存储装置1100可以包括至少一个处理器1110、存储器(例如,非易失性存储器)1120、内存1130和通信接口1140,并且至少一个处理器1110、存储器1120、内存1130和通信接口1140经由总线1160连接在一起。至少一个处理器1110执行在存储器中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。[0118]在一个实施例中,在存储器中存储计算机可执行指令,其当执行时使得至少一个处理器1110:将待存储数据写入数据库系统的内存层的内存表,所述待存储数据包括key-value对中的value;响应于所述内存表写满,自所述数据库系统的数据存储介质的存储层中的顶层分层存储层开始,按照下述方式对所述内存表的存储数据逐层执行数据写入,直到不再触发下层数据写入:读取当前分层存储层的数据存储文件中的全部存储数据;将所写入的上层存储数据与所读取的存储数据合并;将合并后的存储数据中与每个key对应的value切分为主数据块以及对应的附加数据块;分别基于各个主数据块所对应的key的普通哈希值和完美哈希值,确定各个主数据块所在数据存储文件以及各个主数据块在所在数据存储文件中的偏移量,每个数据存储文件对应一个基于key的普通哈希值的哈希值范围;以及根据所确定出的所在数据存储文件以及在所在数据存储文件中的偏移量,对各个主数据块以及对应的附加数据块进行数据写入,所写入的每个主数据块包括元数据,所述元数据包括附加数据块个数、各个附加数据块在数据存储文件中的偏移量和数据长度。[0119]应该理解,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器1110进行本说明书的各个实施例中以上结合图1-图7以及图9描述的各种操作和功能。[0120]图12示出了根据本说明书的实施例的基于计算机系统实现的数据查询装置1200的示意图。如图12所示,数据查询装置1200可以包括至少一个处理器1210、存储器(例如,非易失性存储器)1220、内存1230和通信接口1240,并且至少一个处理器1210、存储器1220、内存1230和通信接口1240经由总线1260连接在一起。至少一个处理器1210执行在存储器中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。[0121]在一个实施例中,在存储器中存储计算机可执行指令,其当执行时使得至少一个处理器1210:响应于接收到用户发起的数据查询请求,在数据库系统的内存层的内存表中进行数据查询,数据库系统按照如上所述的数据存储方法进行数据存储;响应于针对内存层的数据查询结果未完全满足数据查询请求中的数据查询条件,自数据库系统的存储层的顶层分层存储层开始,按照下述方式执行数据查询,直到完全满足数据查询条件或者完成底层分层存储层查询:响应于针对内存层或上层分层存储层的数据查询结果未完全满足数据查询条件,根据数据查询请求的目标数据的key的普通哈希值定位当前分层存储层中的数据存储文件以及根据所述key的完美哈希值定位主数据块在数据存储文件中的偏移量和数据长度;基于所定位的主数据块的偏移量和数据长度,从所在数据存储文件中读取主数据块;对所读取的主数据块进行解析以获取数据查询结果;响应于针对主数据块的数据查询结果未完全满足数据查询条件,获取主数据块中记录的附加数据块的偏移量和数据长度;基于所获取的附加数据块的偏移量和数据长度,从所在数据存储文件中读取所有附加数据块;对所读取的各个附加数据块进行解析以获取数据查询结果;以及将所得到的所有数据查询结果提供给用户。[0122]应该理解,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器1210执行本说明书的各个实施例中以上结合图8以及图10描述的各种操作和功能。[0123]根据一个实施例,提供了一种比如机器可读介质(例如,非暂时性机器可读介质)的程序产品。机器可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被机器执行时,使得机器执行本说明书的各个实施例中以上结合图1-图10描述的各种操作和功能。具体地,可以提供配有可读存储介质的系统或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。[0124]在这种情况下,从可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的可读存储介质构成了本发明的一部分。[0125]可读存储介质的实施例包括软盘、硬盘、磁光盘、光盘(如cd-rom、cd-r、cd-rw、dvd-rom、dvd-ram、dvd-rw、dvd-rw)、磁带、非易失性存储卡和rom。可选择地,可以由通信网络从服务器计算机上或云上下载程序代码。[0126]根据一个实施例,提供一种计算机程序产品,该计算机程序产品包括计算机程序,该计算机程序当被处理器执行时,使得处理器执行本说明书的各个实施例中以上结合图1-图10描述的各种操作和功能。[0127]本领域技术人员应当理解,上面公开的各个实施例可以在不偏离发明实质的情况下做出各种变形和修改。因此,本发明的保护范围应当由所附的权利要求书来限定。[0128]需要说明的是,上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。各步骤的执行顺序不是固定的,可以根据需要进行确定。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。[0129]以上各实施例中,硬件单元或模块可以通过机械方式或电气方式实现。例如,一个硬件单元、模块或处理器可以包括永久性专用的电路或逻辑(如专门的处理器,fpga或asic)来完成相应操作。硬件单元或处理器还可以包括可编程逻辑或电路(如通用处理器或其它可编程处理器),可以由软件进行临时的设置以完成相应操作。具体的实现方式(机械方式、或专用的永久性电路、或者临时设置的电路)可以基于成本和时间上的考虑来确定。[0130]上面结合附图阐述的具体实施方式描述了示例性实施例,但并不表示可以实现的或者落入权利要求书的保护范围的所有实施例。在整个本说明书中使用的术语“示例性”意味着“用作示例、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。[0131]本公开内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本公开内容。对于本领域普通技术人员来说,对本公开内容进行的各种修改是显而易见的,并且,也可以在不脱离本公开内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本公开内容并不限于本文所描述的示例和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献