本申请涉及计算机软件
技术领域:
:,尤其涉及一种lsm树的建立方法、lsm树的数据读取方法和服务器。
背景技术:
::在基于lsm-tree(log-structuredmergetree,lsm树)的存储系统中,一般需要通过compaction消除脏数据。其中,compaction过程就是根据一定策略消除存储引擎中的脏数据,以释放磁盘空间。因为,lsm-tree是一种只读的数据存储模式,现有的lsm-tree中的消除脏数据的方式一般是,合并多个有序文件来去除脏数据。按照lsm-tree模型,将原本的随机写转化为了批量追加写,从而提高了系统的吞吐量。对于lsm树而言,存储引擎中的文件是分层存储的。通过compact动作,从第i层和第i+1层选取若干文件,读入内存,对这些文件中的数据进行排序,以去除脏数据,然后将去除脏数据后的数据写入文件,放到第i+1层。由此可见,在这样模型下,消除脏数据的时候,存在严重的写放大(实际写入的数据量与系统真实写入数据量的比值)情况。假设一个数据从第0层最终移动到第n层,那么在这个数据整个的生命周期中,被写了n-1次,写放大系数就是n-1。进一步的,如果需要从lsm-tree中查找并读取某个数据,那么需要将lsm-tree中各个文件逐个文件读取至内存中进行查找。然而,由于系统硬件的io带宽是有限的,这种基于lsm-tree的查找数据的方式,和消除脏数据时候所存在的写放大情况,都将会严重影响系统的吞吐量。针对上述问题,目前尚未提出有效的解决方案。技术实现要素:本申请实施例的目的是提供一种lsm树的数据读取方法、lsm树的建立方法及服务器,以有效减少系统的读写负担。为解决上述技术问题,本申请实施例是这样实现的:一种lsm树的建立方法,包括:确定内存中是否已写满预定数量的数据;如果已经写满,则将所述内存中的数据,转换为第一类文件和第二类文件,并将所述第二类文件存入lsm树中,将所述第一类文件存入所述lsm树的第0层,其中,所述第一类文件中存储有数据的标识和标识对应的数据的值在第二类文件中的索引,所述第二类文件中存储有数据的值;确定所述lsm树中是否有已经存满数据的层,如果有,则将该层所存的第一类文件和该层的下一层所存的第一类文件读取至内存中;对读取至内存中的第一类文件中的标识进行去重和重新排序,并将去重和重新排序后的第一类文件存入所述该层的下一层。一种lsm树的数据读取方法,包括:响应于数据读取请求,确定内存中是否有所述数据读取请求所请求的数据;如果没有,则从所述lsm树的第0层开始,逐层将当前层的第一类文件缓存至内存中,并确定缓存至内存中的第一类文件中是否存储有所请求数据的索引,其中,所述第一类文件中存储有数据的标识和标识对应的数据的值在第二类文件中的索引;在确定缓存至内存中的第一类文件中存储有所请求数据的索引的情况下,根据索引,将存储有所请求的数据的第二类文件缓存至所述内存中,并从缓存至所述内存中的第二类文件中读取所述数据读取请求所请求的数据。一种服务器,包括存储器、处理器及存储在存储上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:确定内存中是否已写满预定数量的数据;如果已经写满,则将所述内存中的数据,转换为第一类文件和第二类文件,并将所述第二类文件存入lsm树中,将所述第一类文件存入所述lsm树的第0层,其中,所述第一类文件中存储有数据的标识和标识对应的数据的值在第二类文件中的索引,所述第二类文件中存储有数据的值;确定所述lsm树中是否有已经存满数据的层,如果有,则将该层所存的第一类文件和该层的下一层所存的第一类文件读取至内存中;对读取至内存中的第一类文件中的标识进行去重和重新排序,并将去重和重新排序后的第一类文件存入所述该层的下一层。一种服务器,包括存储器、处理器及存储在存储上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:响应于数据读取请求,确定内存中是否有所述数据读取请求所请求的数据;如果没有,则从所述lsm树的第0层开始,逐层将当前层的第一类文件缓存至内存中,并确定缓存至内存中的第一类文件中是否存储有所请求数据的索引,其中,所述第一类文件中存储有数据的标识和标识对应的数据的值在第二类文件中的索引;在确定缓存至内存中的第一类文件中存储有所请求数据的索引的情况下根据索引,将存储有所请求的数据的第二类文件缓存至所述内存中,并从缓存至所述内存中的第二类文件中读取所述数据读取请求所请求的数据。由以上本申请实施例提供的技术方案可见,本申请实施例将数据标识和标识对应的数据值分开在不同文件中存储,使得在进行数据查找的时候,可以仅读取lsm中的标识文件进行查找操作,不需要一并读取存储数据值的文件,相对于未设置标识索引文件的方式,可以减少数据读取量,在进行脏数据删除的时候,也可以仅读取标识文件,对标识文件进行重排序以去除脏数据,然后,再将重排序后的数据写入,因为这个过程中,可以不读取和写入存储数据值的文件,因此,可以减少写放大,从而可以达到有效减少系统的读写负担的技术效果。附图说明为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本申请一个实施例的lsm树的建立方法流程图;图2为本申请一种文件分类的示意图;图3为本申请一个实施例的lsm树示意图;图4为本申请一个实施例的lsm树的数据读取方法流程图;图5为本申请一个实施例的服务器的架构示意图。具体实施方式本申请实施例提供一种lsm树的数据读取方法、lsm树的建立方法及服务器。为了使本
技术领域:
:的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。为了更好地说明本申请,下面先对几个术语进行解释如下:1)lsm-tree,lsm树是一种数据结构,支持增、删、读、改、顺序扫描操作,而且通过批量存储技术规避了磁盘随机写入的问题。lsm树牺牲了部分的读性能,用来大幅提高写性能。基于lsm树实现的数据库有例如:leveldb、hbase等。2)compaction动作,基于lsm树实现的存储引擎中,存储引擎会周期性地执行合并数据的操作,该过程能够消除脏数据,可以将这个消除脏数据的动作称为compaction动作。3)写放大(writeamplification,简称为waf),写放大系数,指代在ssd磁盘中,实际写入的数据量与系统真实写入数据量的比值。4)脏数据,表示已经不再访问的数据,或者是旧数据,或者被逻辑删除了的数据。考虑到现有的lsm树所存在的系统吞吐量负担过重的问题,在申请实施例中提供了一种lsm树的建立方法,如图1所示,可以包括以下步骤:步骤101:确定内存中是否已写满预定数量的数据;内存中可以预先分配一块区域,或者是建立一个存储表格,用于存储后续需要放入lsm树中的数据的。在有数据需要存入lsm树的时候,可以是先存储在内存中,等到内存中的数据满了之后,才会将这些数据一起存入lsm树的第0层。具体地,在实现的时候,lsm树可以是类似金字塔的形状,第0层、第1层、第2层…第m层。越下面的层比越上面的层的存储空间更大一些,例如,第2层的存储空间是大于第1层的,第1层的存储空间是大于第0层的。在存储的时候可以遵循,先存储在第0层,第0层满了之后将第0层的数据一起写入第1层中,以此类推,将数据写入lsm树中。步骤102:如果已经写满,则将所述内存中的数据,转换为第一类文件和第二类文件存入lsm树的第0层,其中,所述第一类文件中包括数据的标识和标识对应的数据的值在第二类文件中的索引,所述第二类文件中包括数据的值:在一个实施方式中,可以有多个第二类文件,相应的,索引可以包括:数据标识所标识的数据所在的第二类文件的文件编号以及在该第二类文件中的偏移量。对于内存中写入lsm树中的数据,可以生成两类文件:第一类文件,用于存储数据的标识(可以称为key)以及,标识对应的数据在第二类文件中的索引;第二类文件,用于存储数据的值(可以称为value)。因为待存储内容分为了key和value两个独立的部分,即,一个key文件和一个value文件,而不是按照key-value对的方式集中存储的,从而使得在进行数据查找或者是数据的排序或者是清除合并的时候,可以直接通过key文件执行,其中,key文件相对于value文件要小很多,因此,通过设置第一类文件和第二类文件的方式,在查找数据或者是去重的时候,可以仅读取第一类文件到内存中,将去重后的数据写入的时候,也就可以仅写入第一类文件,因此可以有效减轻系统的负担。即,可以如图2所示,将原本的kv(键值对)转换为key+索引和value,实现了键和值的分开存储。考虑到lsm树中数据是有序排列的,在本例中,采用了key和value分开存储的方式,那么只需要保证key是有序的,value可以是无序的,只要按照key后面对应的索引查找到对应的value即可,即,在整个过程中key保证是有序的,value是否有序没有影响。步骤103:确定所述lsm树中是否有已经存满数据的层,如果有,则将该层所存的第一类文件和该层的下一层所存的第一类文件读取至内存中;lsm树是存储在存储介质(例如,硬盘)中的,在进行由当前层到下一层的存储过程中,需要先将当前层的数据和下一层的数据,读取至内存中,然后在去重和重排序后存储至下一层。如果是采用key和value不分离的方式,那么就需要将key和value都读取至内存中,然后,再将重排序后的key和value存储至下一层,在本例中,通过key和value的分离存储方式,使得可以仅读取key文件,对key进行重排序后,再将key文件写入下一层,因为不是必须涉及value文件,因此,可以减少读写负担和写放大。对于lsm树中的各层而言,如果上一层已经存满,那么就可以将数据存储至下一层,即,如图3所示,如果第0层存储满了,那么就可以将数据存储至第1层,第1层存储满了之后,就可以将数据存储至第2层,以此类推,实现lsm树的建立。步骤104:对读取至内存中的第一类文件中的标识进行去重和重新排序,并将去重和重新排序后的第一类文件存入所述该层的下一层。具体地,在进行层与层之间数据的存储的时候,可以是将当前层(即,已经满了的层)中的第一类文件(例如:key文件)读取至内存中,然后对key进行重排序后,将重排序后的数据存储至下一层。对于当前层中的第二类文件(例如:value文件)可以直接放至下一层中,也可以仍旧存储在当前层中,具体采用哪种方式,本申请不作限定。这是考虑到,对于value而言,存储在任意一层都是可以的,因此,为了使得上面的层不至于过快被存满,那么可以将value都向下存一层也是可以的。为了使得对数据的移动最小,以便减少写放大,可以减少对value数据的移动,只要可以遍历或者查找到value文件就可以。举例而言对去重进行说明,假设有一个key文件,对应的key为{1,2,5,9,10},另外一个key文件对应的key为{2,10,11,12,15},那么对这两个文件合并去重排序后得到的就是{1,2,5,9,10,11,12,15}。对于lsm树而言,是分层存储的,对于每一层而言,可以有多个文件,例如,文件内是有序存储的,文件之间也是有序的。例如,当前需要将第1层有文件a、b、c和d的文件存至第2层中,当前第2层有文件e和f,那么这个时候,可以将文件a、b、c、d、e和f都读取至内存中,然后进行排序,并顺序存入后再存入lsm树的第2层。假设设置的是每个文件最大为32m,那么,满32m后就作为一个文件存入第2层,然后再继续下一个文件,满了32m之后再作为一个文件存入第2层,即,当新文件到达32m时候,存盘,然后开始新的一个文件,直至所有的数据都被存储至第2层,当然最后一个文件可以不满32m。基于上述方式所建立的lsm树,在去除脏数据(即,执行compaction过程)的过程中,可以显示出该lsm树生成方式的优势。在实现的时候,可以根据实际的情况,或者是当前的系统负荷,确定是采用第一类文件和第二类文件都进行compaction过程,还是仅第一类文件执行compaction过程。例如,如果当前系统负荷比较大,那么可以仅对第一类文件执行compaction过程,如果当前系统处于空闲状态,那么可以对第一类文件和第二类文件都执行compaction过程。在一个实施方式中,可以确定是否满足去除所述lsm树中的脏数据的条件;如果满足,则确定当前条件所对应的去除方式;通过确定的去除方式,去除所述lsm中的脏数据,具体地,可以采用但不限于以下三种方式之一去除脏数据:方式1)读取所述lsm树中的多个第一类文件,根据数据标识对所述多个第一类文件进行去重和重排序操作,将去重和重排序后的数据,写入lsm树中,第二类文件保持不变;方式2)读取第一类文件和与所述第一类文件对应的第二类文件,确定所述第一类文件中的每个索引是否能够在第二类文件中匹配到对应的记录,如果不能,则从第一类文件中删除该条记录,以生成去重后的第一类文件,将去重后的第一类文件写入所述lsm树,第二类文件保持不变;方式3)读取多个第一类文件和与各个第一类文件对应的第二类文件,根据数据标识对第一类文件进行去重和重排序,生成去重后的第一类文件和第二类文件,将去重后的第一类文件和第二类文件写入所述lsm树。基于上述方式所建立的lsm树,本申请实施例还提供了一种lsm树的数据读取方法,如图4所示,可以包括以下步骤:步骤401:响应于数据读取请求,确定内存中是否有所述数据读取请求所请求的数据;即,如果接收到一个数据读取请求,考虑到内存中的数据是查找最快的,那么可以先到内存中查找,确定内存中是否有请求的数据。这样如果在内存中查找到了,就不需要到lsm树中进行查找了。如果内存中,没有,则再到lsm树中逐层进行查找。步骤402:如果没有,则从所述lsm树的第0层开始,逐层将当前层的第一类文件缓存至内存中,并确定缓存至内存中的第一类文件中是否存储有所请求数据的索引,其中,所述第一类文件中存储有数据的标识和标识对应的数据的值在第二类文件中的索引;在对lsm树进行查找的时候,可以选择从第0层开始,采用逐层查找的方式确定lsm树中是否有所请求的数据。考虑到该lsm树在建立的时候,是采用value与key分开的方式,因此,在查找的时候,可以逐次将key文件读取至内存中,以确定lsm树中各层是否有请求的数据,如果通过key文件确定出有要请求的数据,那么直接通过key中该数据所对应的索引到lsm中读取该数据对应的value文件,从而实现对该数据的读取。在确定是否存在要请求的数据,以及确定请求的数据所在的位置的时候,是不需要读取value的,。即,在查找的过程中,只需要将key文件读取至内存中进行查找,而不需要同时将key和value都读取到内存中,大大减少了系统的读负担。例如,当前需要查找第0层,那么可以将第0层中的第一类文件从第0层读取出来,然后根据第一类文件中的数据标识确定是否有所请求的数据,如果在第一类文件中有所请求数据的数据标识,那么就表明有请求的数据,如果没有发现所请求数据的数据标识,那么就可以将第1层中的第一类文件读取至内存中,并判断是否有所请求数据的数据标识。在一个实施方式中,第一类文件中的数据标识是顺序存储的,即,key是按照顺序存储的,那么在判断第一类文件中是否有所请求数据的时候,就可以根据通过二分法确定缓存至内存中的第一类文件中是否有所述数据读取请求所请求的数据。之所以采用二分法,就是因为key是顺序存储,通过这种方式进行查找,查找速度比较快,可以有效提高数据查找和读取的效率。步骤403:在确定缓存至内存中的第一类文件中存储有所请求数据的索引的情况下,根据索引,将存储有所请求的数据的第二类文件缓存至所述内存中,并从缓存至所述内存中的第二类文件中读取所述数据读取请求所请求的数据。对于lsm树而言,有多个第二类文件,为了标识key所对应数据的数据取值在第二类文件中的具体存储位置,第一类文件中在存储数据标识的同时,还存储索引,索引可以包括:数据标识所标识的数据所在的第二类文件的文件编号以及在该第二类文件中的偏移量。在一个实施方式中,根据索引,将存储有所请求的数据的第二类文件缓存至所述内存中,可以包括:根据从第一类文件中查找出的数据所在的第二类文件的文件编号,将该文件编号所对应的第二类文件缓存至所述内存中;根据从第一类文件中查找出的偏移量,从缓存至所述内存中的第二类文件中,读取所述数据请求所请求的数据。即,因为第二类文件有多个,为了定位第二类文件中数据的值的具体存储位置,以便于查找,可以为每个第二类文件都设置一个编号,将第二类文件的编号作为数据索引的一部分,这样在查找的时候,在通过第一类文件查找到所请求的数据之后,可以匹配到存储该数据的值的第二类文件的文件编号,从而定位到存储有所请求数据的第二类文件。可以将该第二类文件读取到内存中,然后通过所请求数据在该第二类文件中的偏移量,便可以实现对数据的最终定位,从而实现数据的查找和读取。在从lsm中读取第一类文件至内存中的时候,可以是一个文件、一个文件读取并判断的,例如,当前lsm树中共有a、b、c、d四个第一类文件,那么可以先读取文件a至内存中,判断a中是否有所请求数据的数据标识,如果没有,则再读取文件b至内存中,即,逐个文件判断是否有所请求数据的数据标识。通过划分文件的方式,可以避免将大文件读入内存,可以减少系统的负荷。下面结合一个具体实施例对上述lsm树的建立和数据读取方法进行说明,然而,值得注意的是,该具体实施例仅是为了更好地说明本申请,并不构成对本申请的不当限定。考虑到现有的lsm树的compaction过程容易造成较为明显的写放大,占用有限的磁盘带宽,以及对系统性能造成较为明显影响,增加了系统的延迟的问题,在本例中,提出了一种上述lsm树的建立和数据读取方法,以达到减少系统整体的写放大,且在compaction过程中,可以占用较少的系统资源。考虑到现有的compaction过程需要从磁盘中读出kv(键值),重排序后写入文件。在compaction完成后,输出的文件中key是有序的。其实整个过程中,只要保证key有序,value是否有序是不重要的。在本例中,将key和value分开存储,可以有选择的分别对key、value,或者2者同时进行compaction。在读写压力较高的情况下,可以只对key进行compaction。在建立lsm树的时候,可以是确定内存中memtable是否已经装满,如果已经装满,则形成两种文件:kbt(keyblock-basedtable)和vpt(valueplaintable),这两种文件是成对出现的。其中,kbt中只存储key,以及该key对应value在vpt中的索引。索引内容可以是vpt文件编号,以及value所在文件内部offset。vpt中只存储value。以sst文件格式为例说明kbt文件和vpt文件的格式:kbt文件格式定义kbt格式完全按照现在leveldb/rocksdb中默认的sst文件格式。kbt:={footer,index-block,{kv-block-1,kv-block-2,…,}}footer:={magic,padding,index-block-handle}index-block:={<key,kv-block-handle>,<key,kv-block-handle>,…,}kv-block:={{key,offset},{key,offset},…{<key,value>,<key,value>,…,}index-block-handle:=kv-block-handle:={offset,size}vpt文件格式定义:vpt:={footer,{item1,item2,…,}}item:={size,content}footer:={magic,padding,itemcount}基于建立的lsm树的,可以分情况采用不同的方式进行compaction:1)key-compaction(仅针对key清除脏数据)将若干个kbt文件,读入内存,进行重排序,并去除脏数据,形成新的kbt文件,其中,文件中每个条目的value值不变,原封不动写入新文件。2)value-compaction(基于value清除key中的脏数据)vpt中可能包含很多无效的value,需要通过compaction去除掉。具体方法可以是:读取vpt文件,以及对应的kbt文件。如果value中的每一个条目文件编号和offset不在对应的kbt文件中有记录,那么新生产的文件中去除掉该条目,并且重新生成对应的kbt文件;3)all-compaction(同时清除key和value中的脏数据)读取若干个kbt文件,以及对应的vpt文件。按照key排序,去除掉脏数据,形成新的文件kbt和vpt文件。由此可见,通过本例所提出的lsm树,在进行compaction的时候,采用key-compaction的方式可以快速去除脏数据,并且极大地减少了写放大,因为在compaction过程中无需重新写value数据,而value数据通常远远大于key的数据。value-compaction可以有效减少磁盘的空间。在系统空闲或者是系统负荷比较小的时候,可以采用all-compaction方式。假设写入的数据总量为d,key占全量数据中的比例为p,lsm共有n层,通过现有的compaction,总量为d的数据写放大系数为n-1,磁盘写入总量为:d(n-1),然而,采用本例的方案,compaction操作的磁盘写入量为:dp(n-1)+d(1-p)。二者比值为:v=(dp(n-1)+d(1-p))/(d(n-1))当n=7,p=0.2时,v=1/3;当n=7,p=0.1时,v=1/4;当n=7,p=0.5时,v=0.58。由此可见,按通常情况kv长度中,key的长度占总长度的20%的时,相同量数据写入磁盘总量为现有的compaction方式的1/3,即使key长度为50%时,相同量数据写入磁盘总量为现有的compaction方式的60%不到。基于上述建立的lsm树,进行读请求处理,可以包括以下步骤:s1:先在内存中读取,如果命中,则将读取结果返回给用户;s2:如果s1中未命中,则读取l0层文件,如果命中,则将读取结果返回给用户;s3:如果s2未命中,则读取l1层文件,如果命中,则返回读取结果给用户;s4:直到读取到最后一层ln,如果命中,则返回读取结果给用户,否则,数据不存在。在读取某一层文件的时候,可以先读取kbt文件,然后再读取vpt文件。一般kbt文件较少,可以将其缓存在内存中,从而加速读操作。本申请实施例还提供了一种服务器,如图5所示,可以包括:存储器、处理器及存储在存储上并可在处理器上运行的计算机程序,处理器执行所述程序时可以实现以下步骤:s1:响应于数据读取请求,确定内存中是否有所述数据读取请求所请求的数据;s2:如果没有,则从所述lsm树的第0层开始,逐层将当前层的第一类文件缓存至内存中,并确定缓存至内存中的第一类文件中是否存储有所请求数据的索引,其中,所述第一类文件中存储有数据的标识和标识对应的数据的值在第二类文件中的索引;s3:如果有,则根据索引,将存储有所请求的数据的第二类文件缓存至所述内存中,并从缓存至所述内存中的第二类文件中读取所述数据读取请求所请求的数据。在一个实施方式中,lsm树中有多个第二类文件,相应的,所述索引可以包括:数据标识所标识的数据所在的第二类文件的文件编号以及在该第二类文件中的偏移量。在一个实施方式中,所述处理器根据索引,将存储有所请求的数据的第二类文件缓存至所述内存中,可以包括:根据从第一类文件中查找出的数据所在的第二类文件的文件编号,将该文件编号所对应的第二类文件缓存至所述内存中;根据从第一类文件中查找出的偏移量,从缓存至所述内存中的第二类文件中,读取所述数据请求所请求的数据。在一个实施方式中,第一类文件中的数据标识可以是顺序存储的,根据缓存至内存中的第一类文件确定当前层是否存储有所述数据读取请求所请求的数据,可以包括:通过二分法确定缓存至内存中的第一类文件中是否有所述数据读取请求所请求的数据。本申请实施例还提供了一种服务器,可以包括存储器、处理器及存储在存储上并可在处理器上运行的计算机程序,处理器执行所述程序时可以实现以下步骤:s1:确定内存中是否已写满预定数量的数据;s2:如果已经写满,则将所述内存中的数据,转换为第一类文件和第二类文件,并将所述第二类文件存入lsm树中,将所述第一类文件存入所述lsm树的第0层,其中,所述第一类文件中存储有数据的标识和标识对应的数据的值在第二类文件中的索引,所述第二类文件中存储有数据的值;s3:确定所述lsm树中是否有已经存满数据的层,如果有,则将该层所存的第一类文件和该层的下一层所存的第一类文件读取至内存中;s4:对读取至内存中的第一类文件中的标识进行去重和重新排序,并将去重和重新排序后的第一类文件存入所述该层的下一层。在一个实施方式中,还可以包括:确定是否满足去除所述lsm树中的脏数据的条件;如果满足,则确定当前条件所对应的去除方式;通过确定的去除方式,去除所述lsm中的脏数据。在一个实施方式中,有多个第二类文件,相应的,所述索引可以包括但不限于:数据的标识所标识的数据所在的第二类文件的文件编号以及在该第二类文件中的偏移量。在一个实施方式中,去除方式可以包括但不限于以下至少之一:1)读取所述lsm树中的多个第一类文件,根据数据标识对所述多个第一类文件进行去重和重排序操作,将去重和重排序后的数据,写入lsm树中,第二类文件保持不变;2)读取第一类文件和与所述第一类文件对应的第二类文件,确定所述第一类文件中的每个索引是否能够在第二类文件中匹配到对应的记录,如果不能,则从第一类文件中删除该条记录,以生成去重后的第一类文件,将去重后的第一类文件写入所述lsm树,第二类文件保持不变;3)读取多个第一类文件和与各个第一类文件对应的第二类文件,根据数据标识对第一类文件进行去重和重排序,生成去重后的第一类文件和第二类文件,将去重后的第一类文件和第二类文件写入所述lsm树。本申请实施例将数据标识和标识对应的数据值分开在不同文件中存储,使得在进行数据查找的时候,可以仅读取lsm中的标识文件进行查找操作,不需要一并读取存储数据值的文件,相对于未设置标识索引文件的方式,可以减少数据读取量,在进行脏数据删除的时候,也可以仅读取标识文件,对标识文件进行重排序以去除脏数据,然后,再将重排序后的数据写入,因为这个过程中,可以不读取和写入存储数据值的文件,因此,可以减少写放大,从而可以达到有效减少系统的读写负担的技术效果。在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmablelogicdevice,pld)(例如现场可编程门阵列(fieldprogrammablegatearray,fpga))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logiccompiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardwaredescriptionlanguage,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(applicationspecificintegratedcircuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc625d、atmelat91sam、microchippic18f26k20以及siliconelabsc8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。当前第1页12当前第1页12