数据的存储方法、读取方法及计算机设备与流程

专利2022-05-10  28

1.本技术属于计算机
技术领域
:,尤其涉及数据的存储方法、读取方法、存储装置、计算机设备及计算机可读存储介质。
背景技术
::2.目前,日志结构合并树(log‑structuredmergetree,lsmtree)是一种用于开发存储引擎的主流存储方式之一。3.lsmtree主要由预写式日志(write‑aheadlogging,wal)、内存表(memtable)、只读内存表(immutablememtable)、有序字符串表(sortedstringtable,sstable)组成。其中:4.wal:wal是一种数据库中常用的用于保证持久性的手段。在lsmtree结构中,若数据先写入memtable,在内存中进行排序,等到写入一定量后再顺序的写入硬盘,形成sstable文件,则在memtable还未转换为sstable的过程中,若系统崩溃,将导致memtable中的数据丢失。为了保证数据的持久性,lsmtree会先将数据顺序写入日志(log),然后再将数据写入memtable。这样即使系统崩溃了,也可以通过log恢复memtable中的数据。5.memtable:位于内存中。6.immutablememtable:immutablememtable结构与memtable结构完全相同,也是存在内存中,只是它不可写,只可读。当写入memtable的数据达到阈值后,memtable会转换为immutablememtable,该immutablememtable将交由后台线程异步的写入文件,生成sstable。7.sstable:sstable由immutablememtable生成的有序的存储写入的记录。8.虽然lsmtree通过将随机输入/输出(input/output,i/o)转换为顺序i/o,已大大提升了写入性能,但其仍需占用一定的i/o资源,而i/o资源被占用将影响计算机设备的性能。故,可结合实际的应用场景进一步优化,以通过减少i/o来提升性能。技术实现要素:9.本技术实施例提供了数据的存储方法,可以解决计算机设备响应速度过慢的问题。10.第一方面,本技术实施例提供了一种数据的存储方法,包括:11.获取需存储的数据,所述需存储的数据所对应的表为临时表;12.在日志结构合并树中存储所述需存储的数据,或,在内存中存储所述需存储的数据;13.在所述日志结构合并树中记录已存储的数据的索引。14.第二方面,本技术实施例提供了一种数据的读取方法,包括:15.接收数据的读取指令,所述读取指令携带需读取的数据对应的表的类型标识,以及,携带所述需读取的数据的索引值;16.根据所述表的类型标识识别所述表是否为临时表;17.若所述表为临时表,则根据所述需读取的数据的索引值和日志结构合并树,从所述日志结构合并树中读取对应的数据或者从内存和硬盘中读取对应的数据,其中,所述日志结构合并树记录了其存储的数据或存储在内存中的数据的索引。18.第三方面,本技术实施例提供了一种数据的存储装置,包括:19.需存储的数据获取模块,用于获取需存储的数据,所述需存储的数据所对应的表为临时表;20.数据存储模块,用于在日志结构合并树中存储所述需存储的数据,或,在内存中存储所述需存储的数据;21.对应关系记录模块,用于在所述日志结构合并树中记录已存储的数据的索引。22.第四方面,本技术实施例提供了一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如第一方面或第二方面所述的方法。23.第五方面,本技术实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面或第二方面所述的方法。24.第六方面,本技术实施例提供了一种计算机程序产品,当计算机程序产品在计算机设备上运行时,使得计算机设备执行上述第一方面或第二方面所述的方法。25.本技术实施例与现有技术相比存在的有益效果是:26.本技术实施例中,若需要在临时表中存入数据,则在日志结构合并树中存储该数据,或者在内存中存储该数据,再在日志结构合并树中记录其存储的数据或已存储在内存中的数据的索引。由于在基于日志结构合并树进行数据存储时,均没有对需存储的数据执行预写式日志的操作,而是直接执行数据存储的操作,因此,能够减少由于执行预写式日志的操作所占用的i/o资源,从而提高了计算机设备的写性能。此外,由于本技术实施例针对的表是临时表,而临时表中的数据是不需要保证持久性,因此,即使不执行预写式日志也不会产生不好的影响。附图说明27.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍。28.图1是本技术一实施例提供的一种数据的存储方法的流程图;29.图2是本技术一实施例提供的另一种数据的存储方法的流程图;30.图3是本技术一实施例提供的数据的存储方法的应用示意图;31.图4是本技术一实施例提供的一种数据的读取方法的流程图;32.图5是本技术另一实施例提供的数据的存储装置的结构框图;33.图6是本技术一实施例提供的一种数据的读取装置的结构框图;34.图7是本技术一实施例提供的一种计算机设备的结构示意图。具体实施方式35.以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本技术实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本技术。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本技术的描述。36.应当理解,当在本技术说明书和所附权利要求书中使用时,术语“包括”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。37.还应当理解,在本技术说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。38.另外,在本技术说明书和所附权利要求书的描述中,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。39.在本技术说明书中描述的参考“一个实施例”或“一些实施例”等意味着在本技术的一个或多个实施例中包括结合该实施例描述的特定特征、结构或特点。由此,在本说明书中的不同之处出现的语句“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。40.实施例一:41.现有技术中,当需要存储表的数据时,可以采用日志结构合并树的方式进行存储,但由于采用日志结构合并树的方式存储数据时,无论针对哪一种类型的表的数据,均是采用相同的存储方式进行存储,比如,均是先将数据顺序写入log,再将数据写入memtable,最后将写入memtable的数据达到阈值转换为immutablememtable的数据,再由后台线程异步地将immutablememtable的数据写入文件,生成sstable。由于上述对数据的存储过程均需要占用一定的i/o资源,而i/o资源是数据库最主要的性能瓶颈,因此,现有的日志结构合并树在存储数据时仍会降低数据库的性能。42.在数据库运行过程中,很多操作都需要使用到临时表,如关联或排序使用到的中间表等。由于临时表只对当前操作有用,操作完成后即可释放,为了节约i/o资源,提升性能,本技术实施例对现有的日志结构合并树进行改进,并基于该改进后的日志结构合并树进行数据的存储。具体地,在本技术实施例中,先判断需存储的数据所对应的表是否为临时表,若是临时表,则直接根据需存储的数据生成内存表,即不再执行将数据顺序写入log的步骤。由于不再执行数据顺序写入log的步骤(即wal),而将数据顺序写入log将占用一些i/o资源,因此,采用本技术实施例的方式进行数据存储时,能够进一步降低对计算机设备的性能的影响。43.下面结合附图对本技术实施例提供的数据的存储方法进行描述。44.图1示出了本技术实施例提供的一种数据的存储方法的流程图,该数据的存储方法应用在计算机设备中,详述如下:45.步骤s11,获取需存储的数据,需存储的数据所对应的表为临时表。46.本实施例中,需存储的数据为将填入临时表的数据,需存储的数据与需生成临时表的场景有关。47.在一些本实施例中,在步骤s11之前,包括:生成空的临时表,即生成没有存入数据的临时表。具体地,当执行指定操作时将生成临时表。其中,上述指定操作包括但不限于关联操作和排序操作。48.例如,在分布式数据库中,要对两个表执行关联,但是两个表的分布规则不一样,这时候就需要对表进行重分布(重分布是指将两个表的分布规则重新统一为相同的分布规则的操作),重分布生成的表就是临时表,此时,需存储的数据为重分布所涉及的数据。49.再如,如果需要对一个表进行排序,那可以建立一个在排序字段上有索引的临时表,此时,需存储的数据即为与排序字段对应的数据。将需存储的数据写入临时表,再按顺序的读取临时表即可得到有序的数据。50.步骤s12,在日志结构合并树中存储需存储的数据,或,在内存中存储需存储的数据。51.其中,上述的内存表是指日志结构合并树中的“memtable”,该memtable位于内存中。52.本实施例中,可将需存储的数据存入日志结构合并树,如存储在日志结构合并树的内存表,得到具有数据的内存表。也可以只将需存储的数据存入内存,而不存入日志结构合并树中的内存表。53.但无论是哪一种情况,均不需要先对需存储的数据执行预写式日志的操作,而是直接执行数据存储的操作(比如存入内存表,或存入内存)。这是因为本技术实施例针对的表是临时表,而临时表中的数据是不需要保证持久性,因此,即使不执行预写式日志也不会产生不好的影响,且不执行预写式日志之后,能够减少对计算机设备的i/o资源的占用,从而有利于提高计算机设备的处理速度。54.步骤s13,在日志结构合并树中记录已存储的数据的索引。55.其中,上述的已存储的数据的索引与已存储的数据一一对应,该已存储的数据包括以下至少一个:已存储在内存表中的数据和已存储在内存中的数据。56.本实施例中,为了便于快速查找到存储的数据,则在内存表中记录已存储的数据所对应的索引,索引值可以是“1”、“2”、“3”等,当然,也可以采用其他标识进行标记,具体视表结构定义和实现决定,只需每个索引值对应一个已存储的数据即可。57.本技术实施例中,若需要在临时表中存入数据,则在日志结构合并树的内存表中存储该数据,或者在内存中存储该数据,再在内存表中记录已存储在内存表或内存中的数据的索引。由于在基于日志结构合并树进行数据存储时,均没有对需存储的数据执行预写式日志的操作,而是直接执行数据存储的操作,因此,能够减少由于执行预写式日志的操作所占用的i/o资源,从而提高了计算机设备的处理速度。此外,由于本技术实施例针对的表是临时表,而临时表中的数据是不需要保证持久性,因此,即使不执行预写式日志也不会产生不好的影响。58.图2示出了本技术实施例提供的另一种数据的存储方法的流程图。在本实施例中,步骤s21与上述的步骤s11相同,此处不再赘述。59.步骤s21,获取需存储的数据,需存储的数据所对应的表为临时表。60.步骤s22,在内存中存储需存储的数据。61.其中,上述的内存是指存储在计算机设备中的“memory”的特定数据结构。62.在一些实施例中,在内存中通过列表顺序存储上述需存储的数据,例如,每条记录(即每条记录的数据)对应一个序号,且通过比较序号的值就能够判断出这些序号的值所对应的记录(即记录的数据)在列表的顺序。其中,这里的序号相当于后续步骤s23的位置信息,该序号可作为数据的唯一标识。由于采用序号(即数据的唯一标识)与存储的数据对应,因此,能够通过序号准确找到对应的数据。63.步骤s23,提取存储在内存中的数据的位置信息。64.本实施例中,当在内存中存储需存储的数据后,即能够确定数据在内存中的位置信息后,提取该位置信息。65.步骤s24,在日志结构合并树的内存表中,记录存储在内存中的数据的索引值与存储在内存中的数据的位置信息的对应关系。66.具体地,索引为索引值和位置信息的对应关系。67.本实施例中,采用key‑value的结构存储数据的索引值和位置信息,即,“key”与数据的索引值对应,“value”用于保存存储在内存中的数据的位置信息。68.由于采用key‑value的结构存储数据的索引值和位置信息,因此,可根据数据的索引值和位置信息准确查找到存储的数据。69.本技术实施例中,由于日志结构合并树的内存表是否转换为只读内存表只与内存表的大小有关,而数据所占用的空间大于内存表记录的对应关系所占用的空间,因此,不在日志结构合并树的内存表中存储需存储的数据,只在内存表中,记录存储在内存中的数据的索引值与存储在内存中的数据的位置信息的对应关系,能够减少日志结构合并树中存储的数据量,从而降低写入放大。此外,由于日志结构合并树的内存表记录了存储在内存中的数据的索引值与存储在内存中的数据的位置信息的对应关系,因此,可先根据数据的索引值确定出存储在内存中的数据的位置信息,进而能够根据该位置信息在内存中准确查找出对应的数据。70.在一些实施例中,数据的存储方法,还包括:71.设置第一内存表阈值,第一内存表阈值用于指示内存表当前能够存储的数据量的最大值。72.对应地,步骤s22包括:73.a1、确定内存中已存储的数据的大小以及内存表的大小之和,得到一和值。74.需要指出的是,这里内存中已存储的数据是指存储在内存中的需要存储的数据。75.a2、若和值不大于预设的临时表大小,则在内存中存储需存储的数据,预设的临时表大小小于第一内存表阈值。76.其中,预设的临时表大小与计算机设备本身的内存大小有关,通常来说,预设的临时表大小与计算机设备本身的内存大小正相关。77.本实施例中,考虑到原有的内存表能够存储的数据量较少,而一旦内存表存储的数据达到其能够存储的数据量的最大值,将会转换为只读内存表,进而生成有序字符串表写入硬盘中(即不再存储在内存中),因此,为了尽可能提高内存的利用率,且保证占用的内存不会影响计算机设备的运行,则为内存表设置第一内存表阈值,该第一内存表阈值大于内存表原来对应的阈值,以及,设置一个临时表大小,且该临时表大小小于第一内存表阈值。这样,只要存储在内存中的数据和内存表存储的对应关系所占据的空间之和(即上述的和值)不大于预设的临时表大小,则继续在内存中存储数据,以及,继续在日志结构合并树的内存表中存储新存入内存的数据的索引值和位置信息的对应关系。78.在一些实施例中,数据的存储方法,还包括:79.b1、若和值大于预设的临时表大小,则将第一内存表阈值降低到第二内存表阈值,以及,在硬盘中存储未存储的数据,并提取存储在硬盘的数据的位置信息,其中,该第二内存表阈值小于预设的临时表大小,未存储的数据是指还没有被存储的需存储的数据。80.具体地,当需存储的数据没有存储在内存中,且和值大于预设的临时表大小,则将该需存储的数据存储在硬盘中。81.本实施例中,可在硬盘中采用堆文件(heapfile)的方式存储未存储的数据。当然,若采用heapfile的方式存储,则存储在硬盘的数据的位置信息采用偏移量表示。82.其中,第一内存表阈值通常设为几百兆字节(mb)、几吉字节(gb),第二内存表阈值通常设为几mb,比如4mb。83.b2、在日志结构合并树新建一个内存表,在新建的内存表中,记录存储在硬盘的数据的索引值与存储在硬盘的数据的位置信息的对应关系。84.本实施例中,由于记录了存储在硬盘的数据的索引值与存储在硬盘的数据的位置信息的对应关系,因此,后续能够根据存储在硬盘的数据的索引值确定存储在硬盘的数据的位置信息。85.上述b1~b2中,由于在存储在内存中的数据和内存表存储的对应关系所占据的空间之和大于预设的临时表大小时,将未存储的数据存储在硬盘中,因此,能够避免过度占用计算机设备的内存。同时,由于在存储在内存中存储的数据和内存表存储的对应关系所占据的空间之和不大于预设的临时表大小时,尽可能将数据存储在内存,而存储在内存不需要占用计算机设备的i/o资源,因此,通过设置临时表的大小来选择数据的存储路径,能够有效提高内存的利用率以及提高该计算机设备的响应速度。此外,由于后续需要根据新建的内存表生成对应的有序字符串表,而较大的内存表需要占用较多的内存,因此,在第一个内存表(即记录了存储在内存中的数据的索引值与存储在内存中的数据的位置信息的对应关系的内存表)的大小达到第一内存表阈值后,将第一内存表阈值修改为较小的第二内存表阈值,能够有效减少内存开销,以及,提升转换为有序字符串表的效率。86.在一些实施例中,本技术实施例提供的数据的存储方法,还包括:87.c1、若和值大于预设的临时表大小,则将记录了存储在内存中的数据的索引值与存储在内存中的数据的位置信息的对应关系的内存表转换为只读内存表,且不会转换为有序字符串表。88.c2、若新建的内存表的大小大于第二内存表阈值,则将新建的内存表转换为只读内存表,并根据转换得到的只读内存表生成有序字符串表。89.具体地,当新建的内存表(memtable)的大小大于第二内存表阈值后,将该新建的内存表(memtable)转换为只读内存表(immutablememtable),再根据该只读内存表生成对应的有序字符串表,该有序字符串表是由immutablememtable生成的有序的存储写入的记录。当然,若仍有需要存储的数据没有被存储,则再次生成新的空的内存表,再返回步骤b2的步骤以及后续步骤,直到需要存储的数据均被存储到硬盘中。90.本实施例中,原来存入内存中的数据继续保留在内存中,供后续读取使用,且将记录了存储在内存中的数据的索引值和该数据的位置信息的对应关系的内存表转换为只读内存表,以免该内存表中记录的信息被更改。即,保证了在超过预设的临时表的大小后,只有新写入的数据写入硬盘,旧数据(已存储在内存中的数据)仍保存在内存中。由于数据仍保留在内存中,因此后续从内存中读取数据时,能够提高计算机设备的读性能。而由于没有将内存中的数据一起写入硬盘,因此,无需占用计算机设备的i/o资源。此外,由于已将内存表存储的数据量的最大值调整为第二内存表阈值,因此,后续只要判断出新建的内存表的大小大于该第二内存表阈值,将执行转换操作。由于该第二内存表阈值较小,因此,能够减少内存占用,且能够快速地将内存表转换为只读内存表,进而能够快速地转换为有序字符串表。91.在一些实施例中,若生成多个有序字符串表,则在步骤c2之后,包括:判断各个有序字符串表之间存储的数据是否存在重叠的数据,若存在重叠的数据,则根据存在重叠的数据的有序字符串表生成新的有序字符串表,且新的有序字符串表之间不存在重叠的数据。例如,假设memtable的上限为5行记录。则在memtable写入1,3,2,5,7之后,该memtable将转换为immutablememtable,该immutablememtable再生成sstable1,该sstable1为[1,2,3,5,7]。继续在新的memtable写入9,8,19,6,4,生成的sstable2保存为[4,6,8,9,19]。由于这两个sstable数据区间存在重叠的数据“4,5,6,7”,因此,假设现在为了查询“4”,此时需要同时查询sstable1和sstable2才可确定是否存在记录4。而如果查询记录9,则只需要查询sstable2即可。为了提高查询效率,通常会由异步的压缩(compaction)线程,定期的对sstable文件进行合并,以生成全局有序的新的sstable文件。例如这里将sstable1和sstable2进行合并,将重新生成[1,2,3,4,5]和[6,7,8,9,19]两个新的sstable文件,旧的sstable文件将被删除。[0092]在一些实施例中,为了便于区分,在采用不同的标识标记存储在内存中的数据的位置信息和存储在硬盘的数据的位置信息。[0093]例如,存储在内存中的数据的位置信息采用序号进行标记,而存储在硬盘的数据的位置信息则采用偏移量进行标记。当然,若两者均采用相同的标识进行标记,则可增加一个标志位进行区分,比如,当标志位为0时,表示对应的标识为存储在内存中的数据的位置信息,而当标志位为1时,表示对应的标识为存储在硬盘的数据的位置信息。[0094]为了更清楚地描述本技术实施例提供的数据的存储方法,下面结合图3进行说明。[0095]1、先将数据记录到内存(memory)中,得到记录的序号值。[0096]2、从记录中提取存储在内存的数据的索引值,以存储在内存的数据的索引值作为key,上述的序号值作为value,插入日志结构合并树的内存表(memtable),此时,该memtable的阈值为第一内存表阈值。[0097]3、若内存中已存储的数据的大小以及内存表的大小之和大于预设的临时表的大小,则日志结构合并树调整memtable的阈值为第二内存表阈值。其中,第一内存表阈值大于预设的临时表大小,原有的memtable变为只读内存表(immutablememtable),且不会转换为有序字符串表(sstable)。[0098]4、将数据记录到堆文件(heapfile),得到记录的偏移量。[0099]5、从记录中提取存储在硬盘的数据的索引值,以存储在硬盘的数据的索引值为key,上述的偏移量为value,插入日志结构合并树新建的内存表(memtable)中。若新建的memtable的大小大于第二内存表阈值,则转换为只读内存表,且进行异步compaction,得到合并后的有序字符串表。[0100]应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本技术实施例的实施过程构成任何限定。[0101]实施例二:[0102]本实施例描述的是读取实施例一存储的数据的方法。[0103]图4示出了本技术实施例提供的一种数据的读取方法的流程图,详述如下:[0104]步骤s41、接收数据的读取指令,读取指令携带需读取的数据对应的表的类型标识,以及,携带需读取的数据的索引值。[0105]具体地,不同类型的表具有不同的类型标识。[0106]步骤s42、根据表的类型标识识别需读取的数据对应的表是否为临时表。[0107]本实施例中,由于数据读取的方式与数据存储的方式有关,而本技术实施例是针对临时表的数据进行存储,因此,需要识别本次需读取的数据是否为临时表的数据,才能根据识别结果选择对应的读取方式。[0108]步骤s43、若需读取的数据对应的表为临时表,则根据需读取的数据的索引值和日志结构合并树,从日志结构合并树中读取对应的数据或者从内存中读取对应的数据,其中,日志结构合并树记录了其存储的数据或存储在内存中的数据的索引。[0109]本实施例中,由于日志结构合并树包含数据的索引,因此,可将需读取的数据的索引值与日志结构合并树中包含的各个数据的索引值比较,进而识别出对应的数据,再选择从日志结构合并树中读取对应的数据,或选择从内存中读取对应的数据。例如,若当时数据存储在内存中,则从内存中读取,反之,则直接从日志结构合并树中读取。[0110]本技术实施例中,由于在基于日志结构合并树进行数据存储时,均没有对需存储的数据执行预写式日志的操作,而是直接执行数据存储的操作,因此,能够减少由于执行预写式日志的操作所占用的i/o资源,从而提高了计算机设备的写性能。也即,整个数据存储、读取过程能够减少对i/o资源的占用,从而提高了计算机设备的写性能。[0111]在一些实施例中,若在内存中存储需存储的数据,且在日志结构合并树的内存表中,记录存储在内存中的数据的索引值与存储在内存中的数据的位置信息的对应关系,则步骤s43根据需读取的数据的索引值和日志结构合并树,从内存中读取对应的数据,包括:[0112]根据需读取的数据的索引值从日志结构合并树中的内存表中匹配出存储在内存中的数据的位置信息,进而根据该位置信息从内存中读取对应的数据。[0113]在一些实施例中,若在内存和硬盘中均存储了数据,且在日志结构合并树的内存表中,记录存储在内存中的数据的索引值与存储在内存中的数据的位置信息的对应关系,以及,在新建的内存表中记录了存储在硬盘的数据的索引值与存储在硬盘的数据的位置信息的对应关系,本技术实施例提供的数据的读取方法,还包括:[0114]若日志结构合并树的内存表中的索引存在与该需读取的数据的索引值相同的索引值,且所述索引值对应的位置信息指向内存,则根据对应的位置信息从内存中读取对应的数据;若所述索引值对应的位置信息指向硬盘,则根据对应的位置信息从硬盘中读取对应的数据。[0115]应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本技术实施例的实施过程构成任何限定。[0116]实施例三:[0117]对应于上文实施例一的数据的存储方法,图5示出了本技术实施例提供的数据的存储装置的结构框图,为了便于说明,仅示出了与本技术实施例相关的部分。[0118]参照图5,该数据的存储装置5包括:需存储的数据获取模块51、数据存储模块52、对应关系记录模块53。其中:[0119]需存储的数据获取模块51,用于获取需存储的数据,需存储的数据所对应的表为临时表。[0120]在一些实施例中,该数据的存储装置5包括:[0121]临时表生成模块,用于生成空的临时表。[0122]数据存储模块52,用于在日志结构合并树中存储需存储的数据,或,在内存中存储需存储的数据。[0123]索引值记录模块53,用于在日志结构合并树中记录已存储的数据的索引。[0124]本技术实施例中,若需要在临时表中存入数据,则在日志结构合并树中存储该数据,或者在内存和硬盘中存储该数据,再在日志结构树中记录已存储的数据或内存中的数据的索引值。由于在基于日志结构合并树进行数据存储时,均没有对需存储的数据执行预写式日志的操作,而是直接执行数据存储的操作,因此,能够减少由于执行预写式日志的操作所占用的i/o资源,从而提高了计算机设备的写性能。此外,由于本技术实施例针对的表是临时表,而临时表中的数据是不需要保证持久性,因此,即使不执行预写式日志也不会产生不好的影响。[0125]在一些实施例中,若在内存中存储需存储的数据,该数据的存储装置5,还包括:[0126]位置信息提取模块,用于提取存储在内存中的数据的位置信息。[0127]对应地,对应关系记录模块53具体用于:[0128]在日志结构合并树的内存表中,记录存储在内存中的数据的索引值与存储在内存中的数据的位置信息的对应关系。[0129]在一些实施例中,数据的存储装置5,还包括:[0130]第一内存表阈值设置模块,用于设置第一内存表阈值,第一内存表阈值用于指示内存表当前能够存储的数据量的最大值。[0131]数据存储模块52在内存中存储需存储的数据时,包括:[0132]和值确定单元,用于确定内存中已存储的数据的大小以及内存表的大小之和,得到一和值。[0133]内存存储单元,用于若和值不大于预设的临时表大小,则在内存中存储需存储的数据,预设的临时表大小小于第一内存表阈值。[0134]在一些实施例中,数据的存储装置5,还包括:[0135]硬盘存储模块,用于若和值大于预设的临时表大小,则将第一内存表阈值降低到第二内存表阈值,以及,在硬盘中存储未存储的数据,并提取存储在硬盘的数据的位置信息,其中,第二内存表阈值小于预设的临时表大小,未存储的数据是指还没有被存储的需存储的数据。[0136]内存表新建模块,用于在日志结构合并树新建一个内存表,在新建的内存表中,记录存储在硬盘的数据的索引值与存储在硬盘的数据的位置信息的对应关系。[0137]在一些实施例中,数据的存储装置5,还包括:[0138]只读内存表转换模块,用于若和值大于预设的临时表大小,则将记录了存储在内存中的数据的索引值与存储在内存中的数据的位置信息的对应关系的内存表转换为只读内存表,且不会转换为有序字符串表。[0139]有序字符串表生成模块,用于若新建的内存表的大小大于第二内存表阈值,则将新建的内存表转换为只读内存表,并根据转换得到的只读内存表生成有序字符串表。[0140]在一些实施例中,采用不同的标识标记存储在内存中的数据的位置信息和存储在硬盘的数据的位置信息。[0141]在一些实施例中,数据的存储装置5,还包括:[0142]重叠数据处理模块,用于若生成多个有序字符串表,则判断各个有序字符串表之间存储的数据是否存在重叠的数据,若存在重叠的数据,则根据存在重叠的数据的有序字符串表生成新的有序字符串表,且新的有序字符串表之间不存在重叠的数据。[0143]需要说明的是,上述装置/单元之间的信息交互、执行过程等内容,由于与本技术方法实施例基于同一构思,其具体功能及带来的技术效果,具体可参见方法实施例部分,此处不再赘述。[0144]实施例四:[0145]对应于上文实施例二的数据的读取方法,图6示出了本技术实施例提供的数据的读取装置的结构框图,为了便于说明,仅示出了与本技术实施例相关的部分。[0146]该数据的读取装置6包括:读取指令接收模块61、表的类型判断模块62、数据读取模块63。其中:[0147]读取指令接收模块61,用于接收数据的读取指令,所述读取指令携带需读取的数据对应的表的类型标识,以及,携带所述需读取的数据的索引值。[0148]表的类型判断模块62,用于根据所述表的类型标识识别所述需读取的数据对应的表是否为临时表。[0149]数据读取模块63,用于若所述需读取的数据对应的表为临时表,则根据所述需读取的数据的索引值和日志结构合并树,从日志结构合并树中读取对应的数据或者从内存中读取对应的数据,其中,所述日志结构合并树记录了其存储的数据或存储在内存中的数据的索引。[0150]本技术实施例中,由于在基于日志结构合并树进行数据存储时,均没有对需存储的数据执行预写式日志的操作,而是直接执行数据存储的操作,因此,能够减少由于执行预写式日志的操作所占用的i/o资源,从而提高了计算机设备的写性能。也即,整个数据存储、读取过程能够减少对i/o资源的占用,从而提高了计算机设备的写性能。[0151]在一些实施例中,数据读取模块63根据需读取的数据的索引值和日志结构合并树,从内存中读取对应的数据时,具体用于:[0152]根据需读取的数据的索引值从日志结构合并树中的内存表中匹配出存储在内存中的数据的位置信息,进而根据该位置信息从内存中读取对应的数据。[0153]在一些实施例中,该数据的读取装置6还包括:[0154]混合读取模块,用于若日志结构合并树的内存表中的索引存在与该需读取的数据的索引值相同的索引值,且所述索引值对应的位置信息指向内存,则根据对应的位置信息从内存中读取对应的数据;若所述索引值对应的位置信息指向硬盘,则根据对应的位置信息从硬盘中读取对应的数据。[0155]实施例五:[0156]图7为本技术一实施例提供的计算机设备的结构示意图。如图7所示,该实施例的计算机设备7包括:至少一个处理器70(图7中仅示出一个处理器)、存储器71以及存储在所述存储器71中并可在所述至少一个处理器70上运行的计算机程序72,所述处理器70执行所述计算机程序72时实现上述任意各个方法实施例中的步骤。[0157]所述计算机设备7可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。该计算机设备可包括,但不仅限于,处理器70、存储器71。本领域技术人员可以理解,图7仅仅是计算机设备7的举例,并不构成对计算机设备7的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如还可以包括输入输出设备、网络接入设备等。[0158]所称处理器70可以是中央处理单元(centralprocessingunit,cpu),该处理器70还可以是其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field‑programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。[0159]所述存储器71在一些实施例中可以是所述计算机设备7的内部存储单元,例如计算机设备7的硬盘或内存。所述存储器71在另一些实施例中也可以是所述计算机设备7的外部存储设备,例如所述计算机设备7上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,所述存储器71还可以既包括所述计算机设备7的内部存储单元也包括外部存储设备。所述存储器71用于存储操作系统、应用程序、引导装载程序(bootloader)、数据以及其他程序等,例如所述计算机程序的程序代码等。所述存储器71还可以用于暂时地存储已经输出或者将要输出的数据。[0160]所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本技术的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。[0161]本技术实施例还提供了一种网络设备,该网络设备包括:至少一个处理器、存储器以及存储在所述存储器中并可在所述至少一个处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任意各个方法实施例中的步骤。[0162]本技术实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现可实现上述各个方法实施例中的步骤。[0163]本技术实施例提供了一种计算机程序产品,当计算机程序产品在移动终端上运行时,使得移动终端执行时实现可实现上述各个方法实施例中的步骤。[0164]所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实现上述实施例方法中的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质至少可以包括:能够将计算机程序代码携带到拍照装置/计算机设备的任何实体或装置、记录介质、计算机存储器、只读存储器(rom,read‑onlymemory)、随机存取存储器(ram,randomaccessmemory)、电载波信号、电信信号以及软件分发介质。例如u盘、移动硬盘、磁碟或者光盘等。在某些司法管辖区,根据立法和专利实践,计算机可读介质不可以是电载波信号和电信信号。[0165]在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。[0166]本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。[0167]在本技术所提供的实施例中,应该理解到,所揭露的装置/网络设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/网络设备实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。[0168]所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。[0169]以上所述实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的精神和范围,均应包含在本技术的保护范围之内。当前第1页12当前第1页12
转载请注明原文地址:https://doc.8miu.com/read-1250196.html

最新回复(0)