两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種鍵值存儲系統(tǒng)中文件壓實的方法和裝置與流程

文檔序號:11133954閱讀:328來源:國知局
一種鍵值存儲系統(tǒng)中文件壓實的方法和裝置與制造工藝
本發(fā)明涉及數(shù)據(jù)處理
技術(shù)領(lǐng)域
,尤其涉及一種KV-Store(Key-ValueStore,鍵值存儲)系統(tǒng)中文件壓實的方法和裝置。
背景技術(shù)
:KV-Store系統(tǒng)被廣泛應(yīng)用于大數(shù)據(jù)存儲與處理中,其數(shù)據(jù)模型以Key-Value(鍵-值)對為基本單位;其提供的基本的操作包括GET(讀)操作和PUT(寫)操作。服務(wù)器執(zhí)行PUT操作的過程通常包括:先將Key-Value對寫入內(nèi)存中的MemTable(MemoryTable,內(nèi)存表)中;當MemTable已滿時,在外部存儲(簡稱外存,例如磁盤等)中創(chuàng)建一個SSTable(SortedStringTable,有序字符串表),然后將MemTable中的Key-Value對排序?qū)懭朐揝STable中,PUT操作在用Key-Value對的新值代替舊值的時候,并不對仍然保存在外存的某個SSTable中的舊值進行刪除;依次類推,隨著PUT操作的增多,外存中可以包含一個或多個SSTable,其中包含的不斷積累的大量被替代的舊值也會帶來空間占用和影響性能的問題。后續(xù)通過Compaction(壓實)機制歸并全部或部分SSTable,以去除同一Key對應(yīng)的非最新Value所對應(yīng)的Key-Value對,從而實現(xiàn)節(jié)省存儲空間的目的。目前,Compaction一般為多文件壓實,即實現(xiàn)多個SSTable之間的歸并;具體可以分為MajorCompaction(全部壓實)和MinorCompaction(部分壓實)。其中,MajorCompaction是指一次歸并所有SSTable,MinorCompaction是指一次歸并部分SSTable。利用上述提供的方法執(zhí)行壓實操作時,需要同時讀取多個待壓實SSTable中的數(shù)據(jù),這需要占用很大的I/O帶寬和內(nèi)存資源;這樣,在利用上述提供的方法執(zhí)行壓實操作的同時,能夠預(yù)留給其他操作的資源較少,使得執(zhí)行其他操作的速率會很慢,從而影響用戶的使用。技術(shù)實現(xiàn)要素:本發(fā)明的實施例提供一種鍵值存儲系統(tǒng)中文件壓實的方法和裝置,用以減少執(zhí)行壓實操作時所需要占用的I/O帶寬和內(nèi)存資源,從而使得在執(zhí)行壓實操作的過程中,不影響執(zhí)行其他操作的速率,以提升用戶體驗。為達到上述目的,本發(fā)明的實施例采用如下技術(shù)方案:第一方面,提供一種鍵值存儲KV-Store系統(tǒng)中文件壓實的方法,包括:根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable;其中,所述DeleteLog中記錄有所述待壓實SSTable中保存的所述KV-Store系統(tǒng)中的非最新值Value所對應(yīng)的鍵Key,所述新的SSTable中不包含所述DeleteLog中的Key對應(yīng)的Key-Value對;刪除所述待壓實SSTable。結(jié)合第一方面,在第一種可能的實現(xiàn)方式中,在所述根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable之前,所述方法還包括:在所述待壓實SSTable中,確定所述KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,作為目標Key;在所述DeleteLog中記錄所述目標Key。結(jié)合第一方面的第一種可能的實現(xiàn)方式,在第二種可能的實現(xiàn)方式中,所述在所述DeleteLog中記錄所述目標Key,包括:在確定所述DeleteLog中不包含所述目標Key時,在所述DeleteLog中記錄所述目標Key。結(jié)合第一方面、第一方面的一種可能的實現(xiàn)方式或第二種可能的實現(xiàn)方式,在第三種可能的實現(xiàn)方式中,所述根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable,包括:拷貝所述待壓實SSTable中的、且不屬于所述DeleteLog中的Key 對應(yīng)的Key-Value,生成新的SSTable。結(jié)合第一方面,在第四種可能的實現(xiàn)方式中,在所述根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable之前,所述方法還包括:接收攜帶有待查找Key的讀GET操作;在根據(jù)所述GET操作獲取到所述待查找Key對應(yīng)的最新Value后,確定所述待查找Key對應(yīng)的次新Value所在的SSTable,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key。結(jié)合第一方面,在第五種可能的實現(xiàn)方式中,所述KV-Store系統(tǒng)應(yīng)用于增量存儲場景,在所述根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable之前,所述方法還包括:接收攜帶有待查找鍵Key的讀GET操作;在根據(jù)所述GET操作獲取到所述待查找Key對應(yīng)的最新Value后,確定所述待查找Key對應(yīng)的最新Value所在的SSTable,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key;接收攜帶有所述待查找Key的PUT操作。結(jié)合第一方面的第四種可能的實現(xiàn)方式或第五種可能的實現(xiàn)方式,在第六種可能的實現(xiàn)方式中,所述在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key,包括:在所述確定的SSTable對應(yīng)的DeleteLog中不包含所述待查找Key時,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key。結(jié)合第一方面,在第七種可能的實現(xiàn)方式中,所述根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable,包括:當待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog中的Key的數(shù)量大于或等于預(yù)設(shè)閾值時,根據(jù)所述DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable。結(jié)合第一方面,在第八種可能的實現(xiàn)方式中,所述待壓實SSTable 對應(yīng)一個布隆過濾器BloomFilter,所述BloomFilter中記錄有所述DeleteLog中的Key,所述方法還包括:當所述KV-Store系統(tǒng)所在的服務(wù)器故障恢復(fù)后,將所述BloomFilter的初始值設(shè)置為空;或,在所述KV-Store系統(tǒng)為分布式存儲系統(tǒng)、且所述DeleteLog為本地DeleteLog時,當所述KV-Store系統(tǒng)所在的服務(wù)器故障恢復(fù)后,根據(jù)全局DeleteLog中記錄的Key確定所述BloomFilter的初始值;其中,所述全局DeleteLog中記錄有所述本地DeleteLog中的Key。第二方面,提供一種服務(wù)器,包括鍵值存儲KV-Store系統(tǒng),所述服務(wù)器還包括:壓實單元,用于根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable;其中,所述DeleteLog中記錄有所述待壓實SSTable中保存的所述KV-Store系統(tǒng)中的非最新值Value所對應(yīng)的鍵Key,所述新的SSTable中不包含所述DeleteLog中的Key對應(yīng)的Key-Value對;刪除單元,用于刪除所述待壓實SSTable。結(jié)合第二方面,在第一種可能的實現(xiàn)方式中,所述服務(wù)器還包括:第一確定單元,用于在所述待壓實SSTable中,確定所述KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,作為目標Key;記錄單元,用于在所述DeleteLog中記錄所述目標Key。結(jié)合第二方面的第一種可能的實現(xiàn)方式,在第二種可能的實現(xiàn)方式中,所述記錄單元具體用于:在確定所述DeleteLog中不包含所述目標Key時,在所述DeleteLog中記錄所述目標Key。結(jié)合第二方面、第二方面的第一種可能的實現(xiàn)方式或第二方面的第二種可能的實現(xiàn)方式,在第三種可能的實現(xiàn)方式中,所述壓實單元具體用于:拷貝所述待壓實SSTable中的、且不屬于所述DeleteLog中的Key對應(yīng)的Key-Value,生成新的SSTable。結(jié)合第二方面,在第四種可能的實現(xiàn)方式中,所述服務(wù)器還包括:接收單元,用于接收攜帶有待查找Key的讀GET操作;第二確定單元,用于在根據(jù)所述GET操作獲取到所述待查找Key對應(yīng)的最新Value后,確定所述待查找Key對應(yīng)的次新Value所在的SSTable,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key。結(jié)合第二方面,在第五種可能的實現(xiàn)方式中,所述KV-Store系統(tǒng)應(yīng)用于增量存儲場景,所述服務(wù)器還包括:接收單元,用于接收攜帶有待查找Key的讀GET操作;第二確定單元,用于在根據(jù)所述GET操作獲取到所述待查找Key對應(yīng)的最新Value后,確定所述待查找Key對應(yīng)的最新Value所在的SSTable,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key;所述接收單元還用于,接收攜帶有所述待查找Key的PUT操作。結(jié)合第二方面的第四種可能的實現(xiàn)方式或第五種可能的實現(xiàn)方式,在第六種可能的實現(xiàn)方式中,所述第二確定單元在執(zhí)行在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key時,具體用于:在所述確定的SSTable對應(yīng)的DeleteLog中不包含所述待查找Key時,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key。結(jié)合第二方面,在第七種可能的實現(xiàn)方式中,所述壓實單元具體用于:當待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog中的Key的數(shù)量大于或等于預(yù)設(shè)閾值時,根據(jù)所述DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable。結(jié)合第二方面,在第八種可能的實現(xiàn)方式中,所述待壓實SSTable對應(yīng)一個布隆過濾器BloomFilter,所述BloomFilter中記錄有所述DeleteLog中的Key,所述服務(wù)器還包括:第三確定單元,用于:當所述KV-Store系統(tǒng)所在的服務(wù)器故障恢復(fù)后,將所述BloomFilter的初始值設(shè)置為空;或,在所述KV-Store系統(tǒng)為分布式存儲系統(tǒng)、且所述DeleteLog為本地DeleteLog時,當所述KV-Store系統(tǒng)所在的服務(wù)器故障恢復(fù)后,根據(jù)全局DeleteLog中記錄的Key確定所述BloomFilter的初始值;其中, 所述全局DeleteLog中記錄有所述本地DeleteLog中的Key。上述技術(shù)方案中,根據(jù)待壓實SSTable對應(yīng)的DeleteLog,對待壓實SSTable進行壓實,生成新的SSTable;其中,該DeleteLog中記錄有待壓實SSTable中保存的KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,該新的SSTable中不包含該DeleteLog中的Key對應(yīng)的Key-Value對;然后,刪除該待壓實SSTable,從而實現(xiàn)了單文件壓實。該方法中,每次壓實操作時只需要讀取一個SSTable中的數(shù)據(jù);相比現(xiàn)有技術(shù)中的多文件壓實的方法,需要占用的I/O帶寬和內(nèi)存資源較小,這樣,在利用該方法執(zhí)行壓實操作的同時,可以為其他操作預(yù)留更多的資源,以不影響執(zhí)行其他操作的速率,從而提升了用戶體驗。附圖說明為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1為現(xiàn)有技術(shù)中提供的一種執(zhí)行PUT操作的過程的示意圖;圖2為現(xiàn)有技術(shù)中提供的一種執(zhí)行GET操作的過程的示意圖;圖3為本發(fā)明實施例一提供的一種KV-Store系統(tǒng)中文件壓實的方法的流程示意圖;圖4為本發(fā)明實施例二提供的一種服務(wù)器中所涉及的數(shù)據(jù)結(jié)構(gòu)的示意圖;圖5為本發(fā)明實施例二提供的一種在DeleteLog中記錄Key的方法的流程示意圖;圖6為本發(fā)明實施例二提供的另一種在DeleteLog中記錄Key的方法的流程示意圖;圖7為本發(fā)明實施例三提供的一種基于圖5或圖6的KV-Store系統(tǒng)中文件壓實的方法的流程示意圖;圖8為本發(fā)明實施例提供的一種DeleteLog的結(jié)構(gòu)示意圖;圖9為本發(fā)明實施例四提供的一種服務(wù)器的結(jié)構(gòu)示意圖;圖10為本發(fā)明實施例四提供的另一種服務(wù)器的結(jié)構(gòu)示意圖;圖11為本發(fā)明實施例五提供的一種服務(wù)器的結(jié)構(gòu)示意圖。具體實施方式下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。下面首先對本發(fā)明實施例中所涉及的部分術(shù)語進行解釋說明,以方便本領(lǐng)域技術(shù)人員理解。1)、KV-Store系統(tǒng)本發(fā)明實施例中的“KV-Store系統(tǒng)”可以為分布式存儲系統(tǒng),也可以為本地存儲系統(tǒng)。其中,當“KV-Store系統(tǒng)”為分布式存儲系統(tǒng)時,KV-Store系統(tǒng)可以分布在多個服務(wù)器上,每個服務(wù)器上運行該KV-Store系統(tǒng)的部分進程;KV-Store系統(tǒng)的全部數(shù)據(jù)被劃分為多個子集,每個子集由一個服務(wù)器的KV-Store系統(tǒng)進程進行管理。當“KV-Store系統(tǒng)”為本地文件存儲系統(tǒng)時,KV-Store系統(tǒng)包含在一個服務(wù)器上,KV-Store系統(tǒng)的全部數(shù)據(jù)由該服務(wù)器上的KV-Store系統(tǒng)進程進行管理。2)、PUT操作PUT操作攜帶有一個Key-Value對,可以表示為PUT(Key,Value)操作。服務(wù)器執(zhí)行PUT(Key,Value)操作的過程可以包括:先將PUT操作所攜帶的Key-Value對寫入內(nèi)存中的MemTable中;當MemTable已滿時,在外存中創(chuàng)建一個SSTable,并將MemTable中的Key-Value對排序?qū)懭隨STable中。其中,“將PUT操作所攜帶的Key-Value對寫入MemTable中”可 以包括:若MemTable中已包含PUT操作所攜帶的Key,則將MemTable中包含的該Key對應(yīng)的Value更新為PUT操作所攜帶的Value;若MemTable中未包含PUT操作所攜帶的Key,則在MemTable中寫入PUT操作所攜帶的Key-Value對。需要說明的是,SSTable只在創(chuàng)建時被寫入一次,之后就成為只讀文件,不能再被修改,但是可以被刪除。從上面的描述可以看出,KV-Store系統(tǒng)的PUT操作雖然使Key-Value對的新Value代替了舊Value,但是舊Value仍然保存在外存的某個SSTable中。尤其對于頻繁修改更新的Key,實際的外存存儲的舊Value比最新Key-Value對中的Value消耗多倍的空間。另外需要說明的是,隨著PUT操作的增多,外存中的SSTable的數(shù)量會逐漸增多。一般地,一個SSTable中的任意兩個Key-Value對的Key不同,不同SSTable中可能包含具有相同Key的Key-Value對。不同的SSTable按照創(chuàng)建時間的先后順序進行排列,同一SSTable中的Key-Value對按照Key的大小進行排序。另外需要說明的是,當KV-Store系統(tǒng)為分布式存儲系統(tǒng)時,一般地,一個Key對應(yīng)的所有Key-Value對均會被記錄在同一個服務(wù)器中;不同Key對應(yīng)的Key-Value對可能被記錄在不同的服務(wù)器中。參見圖1,為現(xiàn)有技術(shù)中提供的一種執(zhí)行PUT操作的過程的示意圖。3)、GET操作GET操作攜帶有一個Key,可以表示為GET(Key)操作,用于查找該Key對應(yīng)的最新Value。需要說明的是,下文中將GET操作攜帶的Key稱為“待查找Key”。服務(wù)器執(zhí)行GET(Key)操作的過程可以包括:先在MemTable中查找GET操作所攜帶的Key,若查找到,則輸出該Key對應(yīng)的Value;若沒有查找到,則按照創(chuàng)建時間依次從最新SSTable到最舊SSTable中查找GET操作所攜帶的Key,若查找到,則輸出該Key對應(yīng)的Value。其中,所輸出的Value即為該Key對應(yīng)的最新Value。需要說明的是,具體實現(xiàn)時,服務(wù)器的內(nèi)存中緩存有每個SSTable 對應(yīng)的BloomFilter(布隆過濾器)和BlockIndex(塊索引)。其中,BloomFilter一般用于提供針對查詢的過濾功能,例如,對于集合A={a0,a1,…,an},若想知道是否b∈A,則可以首先建立一個m位的位向量(bitvector),其中,Bitvector的每一位初始為0;其次,確定k個互不相同的哈希函數(shù)(例如,Hash0,Hash1,…,Hashk)。其中,m和k是可調(diào)參數(shù)。然后,對于A中的每個元素aj,計算哈希函數(shù),并把相應(yīng)的位置設(shè)為1,也就是Hashi(aj)位置都設(shè)為1;依次類推,對A中的所有元素都完成此操作,最終獲得的bitvector就是代表A的BloomFilter。對于需要查詢的元素b,可以計算b的k個哈希函數(shù),測試bitvector中相應(yīng)的位置,即所有Hashi(b)所對應(yīng)的位置,只有當b的哈希函數(shù)計算結(jié)果中所有k個bit都為1時,b才可能出現(xiàn)在A中。如果b的哈希函數(shù)計算結(jié)果中k個bit中任意一個為0,那么b一定不在A中。于是,通過BloomFilter就可以快速地過濾掉b不屬于A的情況。BlockIndex用于在SSTable中每隔一定個數(shù)的Key-Value對記錄Key和所在的字節(jié)位置?!皬腟STable中查找GET操作所攜帶的Key”可以包括:在通過SSTable對應(yīng)的BloomFilter的測試之后,從SSTable對應(yīng)的BlockIndex中查找GET操作所攜帶的Key;若在某個BlockIndex中查找到該Key,則從該BlockIndex所對應(yīng)的Block中查找該Key,并輸出該Key對應(yīng)的Value。其中,一個SSTable可以包括多個Block。參見圖2,為現(xiàn)有技術(shù)中提供的一種執(zhí)行GET操作的過程的示意圖。其中,圖2中的“BF”表示BloomFilter,即下述的BFs;“Ind”表示BlockIndex。4)、DeleteLog(待刪除日志)DeleteLog是本發(fā)明實施例中為SSTable創(chuàng)建的Log文件,用于記錄其所對應(yīng)的SSTable中的非最新Value所對應(yīng)的Key。其中,Log文件是一種按照時間先后順序記錄某種操作的信息的一種特殊的文件,只在文件末尾進行追加操作。DeleteLog位于外存中。具體實現(xiàn)時,可以為每個SSTable創(chuàng)建一個DeleteLog,也可以為多個SSTable共同創(chuàng)建一個DeleteLog。例如,當服務(wù)器在外存中生成一個SSTable時,為該SSTable創(chuàng)建一個Delete Log;或者,當服務(wù)器在外存中生成預(yù)設(shè)數(shù)量個SSTable時,為該預(yù)設(shè)數(shù)量個SSTable創(chuàng)建一個DeleteLog。其中,本發(fā)明實施例對“預(yù)設(shè)數(shù)量”的取值及取值方式不進行限定。5)、BFs和BFd在本發(fā)明的一些實施例/實現(xiàn)方式中,在內(nèi)存中為SSTable設(shè)置了BloomFilter。為了區(qū)分現(xiàn)有技術(shù)中的GET操作所涉及的“SSTable對應(yīng)的BloomFilter”和本發(fā)明實施例新增加的“SSTable對應(yīng)的BloomFilter”,本文中將現(xiàn)有技術(shù)中的“SSTable對應(yīng)的BloomFilter”稱為BFs,將本發(fā)明實施例中新增加的“SSTable對應(yīng)的BloomFilter”稱為BFd。其中,“SSTable對應(yīng)的BFd”用于過濾該SSTable對應(yīng)的DeleteLog中的Key。6)、本文中的“和/或”僅僅是一種描述關(guān)聯(lián)對象的關(guān)聯(lián)關(guān)系,表示可以存在三種關(guān)系,例如,A和/或B,可以表示:單獨存在A,同時存在A和B,單獨存在B這三種情況。“/”表示“或”?!岸鄠€”是指兩個或兩個以上。實施例一參見圖3,為本發(fā)明實施例提供的一種KV-Store系統(tǒng)中文件壓實的方法的流程示意圖。圖3所示的方法應(yīng)用于包含KV-Store系統(tǒng)的服務(wù)器中。該方法包括以下步驟S301-S302:S301:根據(jù)待壓實SSTable對應(yīng)的DeleteLog,對待壓實SSTable進行壓實,生成新的SSTable;其中,該DeleteLog中記錄有待壓實SSTable中保存的KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,該新的SSTable中不包含該DeleteLog中的Key對應(yīng)的Key-Value對。其中,本實施例提供的方法的執(zhí)行主體可以為包含KV-Store系統(tǒng)的服務(wù)器。其中,當“KV-Store系統(tǒng)”為分布式存儲系統(tǒng)時,“包含KV-Store系統(tǒng)的服務(wù)器”可以為KV-Store系統(tǒng)所分布的任一個服務(wù)器,即包含KV-Store系統(tǒng)進程的任一個服務(wù)器。“待壓實SSTable”可以為KV-Store系統(tǒng)中的任一個SSTable?!按? 壓實SSTable”可以獨立對應(yīng)一個DeleteLog,也可以與KV-Store系統(tǒng)中的其他SSTable共享一個DeleteLog。“KV-Store系統(tǒng)中的Value”包括KV-Store系統(tǒng)所在的所有服務(wù)器的內(nèi)存和外存中記錄的Value,具體包括KV-Store系統(tǒng)所在的所有服務(wù)器中的MemTable和SSTable中記錄的Value。“KV-Store系統(tǒng)中的最新Value”可以記錄在MemTable或SSTable中。“KV-Store系統(tǒng)中的非最新Value”一般記錄在SSTable中。其中,“非最新Value”是指具有相同Key的多個Key-Value對中的、且被記錄的時間不是最晚的一個Key-Value對中的Value;具體可以包括:具有相同Key的多個Key-Value對中的、且在“第1、2、3、……、(i-1)次”中的任意一次或多次被記錄的Value;其中,第i-1次被記錄的Value為該Key對應(yīng)的“次新Value”;i為大于或等于1的整數(shù)。需要說明的是,多個具有相同Key的Key-Value對可以被記錄在多個SSTable中,也可以被記錄在MemTable和一個/多個SSTable中。由上述描述可知,“DeleteLog”中所記錄的Key至少在MemTable中或者創(chuàng)建時間在待壓實SSTable之后的一個SSTable(即比待壓實SSTable更新的一個SSTable)中被記錄過。本發(fā)明實施例對在DeleteLog中記錄Key的具體實現(xiàn)方式不進行限定。可選的,步驟S301具體可以實現(xiàn)為:拷貝待壓實SSTable中的、且不屬于該DeleteLog中的Key對應(yīng)的Key-Value對,生成新的SSTable。舉例而言,通過歸并待壓實SSTable和該DeleteLog,拷貝待壓實SSTable中的、且不屬于該DeleteLog中的Key對應(yīng)的Key-Value對,生成新的SSTable。其中,“歸并待壓實SSTable和該DeleteLog”的實現(xiàn)方法可以參考現(xiàn)有技術(shù)中的歸并操作。需要說明的是,在步驟S301之后,該方法還可以包括:為新的SSTable創(chuàng)建新的DeleteLog,以對新的SSTable執(zhí)行壓實操作作準備。S302:刪除待壓實SSTable。步驟S302可以理解為:用步驟S301中生成的新的SSTable替換待壓實SSTable。需要說明的是,在執(zhí)行S302之后,該方法還可以包括:刪除待壓實 SSTable對應(yīng)的信息,其中,待壓實SSTable對應(yīng)的信息可以包括但不限于以下信息中的一種或幾種:待壓實SSTable對應(yīng)的DeleteLog、后續(xù)可選的實現(xiàn)方式中所涉及的DeleteLogBuffer(待刪除日志緩存)、待壓實SSTable對應(yīng)的BFd等。本實施例提供的KV-Store系統(tǒng)中文件壓實的方法,根據(jù)待壓實SSTable對應(yīng)的DeleteLog,對待壓實SSTable進行壓實,生成新的SSTable;其中,該DeleteLog中記錄有待壓實SSTable中保存的KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,該新的SSTable中不包含該DeleteLog中的Key對應(yīng)的Key-Value對;然后,刪除該待壓實SSTable,從而實現(xiàn)了單文件壓實。該方法中,每次壓實操作時只需要讀取一個SSTable中的數(shù)據(jù);相比現(xiàn)有技術(shù)中的多文件壓實的方法,需要占用的I/O帶寬和內(nèi)存資源較小,這樣,在利用該方法執(zhí)行壓實操作的同時,可以為其他操作預(yù)留更多的資源,以不影響執(zhí)行其他操作的速率,從而提升了用戶體驗。另外,相比現(xiàn)有技術(shù)提供的多文件壓實的方法,利用本發(fā)明實施例提供的單文件壓實的方法,在每次執(zhí)行壓實操作的過程中需要處理的數(shù)據(jù)較少,因此所需要的時間較短;這樣,能夠為其他操作預(yù)留更多的處理時間,從而提高了用戶體驗。進一步地,為了保證讀寫效率,一般需要在內(nèi)存中設(shè)置讀寫緩沖,現(xiàn)有技術(shù)中提供的多文件壓實的方法在每次執(zhí)行壓實操作時,需要讀取多個SSTable中的數(shù)據(jù),因此需要在內(nèi)存中設(shè)置很大的讀寫緩沖,這需要占用很大的內(nèi)存資源。而利用本發(fā)明實施例提供的單文件壓實的方法,只需要讀取一個SSTable中的數(shù)據(jù),因此相比現(xiàn)有技術(shù),需要在內(nèi)存中設(shè)置的讀寫緩沖所占用的空間較少,也就是說,占用的內(nèi)存資源較少;這樣,可以為其他操作預(yù)留更多的內(nèi)存資源,從而提高了KV-Store系統(tǒng)的性能。在一種可選的實現(xiàn)方式中,步驟S301可以包括:當待壓實SSTable對應(yīng)的DeleteLog中的Key的數(shù)量大于或等于預(yù)設(shè)閾值時,根據(jù)該DeleteLog,對待壓實SSTable進行壓實。舉例而言,在該可選的實現(xiàn)方式中,將“待壓實SSTable對應(yīng)的DeleteLog中的Key的數(shù)量大于或等于預(yù)設(shè)閾值”作為對待壓實SSTable進行 壓實的觸發(fā)條件。具體實現(xiàn)時,也可以在其他觸發(fā)條件下對待壓實SSTable進行壓實,例如,在預(yù)定的時刻或周期性地對待壓實SSTable進行壓實;其中,預(yù)定的時刻可以為一具體時刻,也可以為服務(wù)器的空閑時刻等。本發(fā)明實施例中對“預(yù)設(shè)閾值”的取值及該取值的獲取方式不進行限定,例如,具體可以為待壓實SSTable中的Key的數(shù)量的一半,當然還可以為其他值。在一種可選的實現(xiàn)方式中,在步驟S301之前,該方法還可以包括:在待壓實SSTable中,確定KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,作為目標Key;在該DeleteLog中記錄該目標Key。舉例而言,若待壓實SSTable為KV-Store系統(tǒng)中創(chuàng)建時間最晚的SSTable(即最新SSTable),那么,服務(wù)器可以通過對比待壓實SSTable與MemTable,從而將待壓實SSTable中的、且被記錄在MemTable中的Key作為目標Key。若待壓實SSTable不為KV-Store系統(tǒng)中創(chuàng)建時間最晚的SSTable,那么,服務(wù)器可以對比待壓實SSTable與MemTable,以及對比待壓實SSTable與創(chuàng)建時間在該待壓實SSTable之后的SSTable,從而將待壓實SSTable中的、且被記錄在MemTable/創(chuàng)建時間在該待壓實SSTable之后的SSTable中的Key作為目標Key。需要說明的是,在該可選的實現(xiàn)方式中,若待壓實SSTable中的每個Key均沒有被記錄在MemTable和創(chuàng)建時間在待壓實SSTable之后的所有SSTable中,那么,該待壓實SSTable中不包含目標Key。舉例而言,在該DeleteLog中記錄所述目標Key,可以包括:在確定該DeleteLog中不包含該目標Key時,在該DeleteLog中記錄該目標Key。該方式,能夠避免在該DeleteLog中重復(fù)記錄目標Key。具體的:可以預(yù)先在服務(wù)器的內(nèi)存中為待壓實SSTable建立一個BloomFilter,該BloomFilter中記錄有該DeleteLog中的Key;該情況下,“在確定該DeleteLog中不包含該目標Key時,在該DeleteLog中記錄該目標Key”可以包括:在確定該BloomFilter中不包含目標Key時,在該DeleteLog中記錄目標Key。具體實現(xiàn)時,服務(wù)器可以預(yù)先為每個SSTable設(shè)置一個BloomFilter(即BFd)。根據(jù)BloomFilter的基本原理可知,若目標Key沒有通過待 壓實SSTable對應(yīng)的BFd的測試,則目標Key一定沒有被記錄在該DeleteLog中。上述“該BloomFilter中不包含目標Key”被認為目標Key沒有通過該BloomFilter的測試。進一步可選的,該DeleteLog對應(yīng)內(nèi)存中的一個DeleteLogBuffer;該情況下,在DeleteLog中記錄目標Key,可以包括:當DeleteLogBuffer中的目標Key的數(shù)量大于或等于第二預(yù)設(shè)閾值時,在該DeleteLog中記錄目標Key。舉例而言,該可選的實現(xiàn)方式中,服務(wù)器可以在內(nèi)存中為每個DeleteLog設(shè)置一個DeleteLogBuffer,并首先在該DeleteLog對應(yīng)的DeleteLogBuffer中記錄目標Key;當該DeleteLogBuffer中的目標Key的數(shù)量大于或等于第二預(yù)設(shè)閾值時,再將該DeleteLogBuffer中的Key依次寫入該DeleteLog。由于服務(wù)器在內(nèi)存中讀寫數(shù)據(jù)的速率遠大于在外存中讀寫數(shù)據(jù)的速率,因此該可選的實現(xiàn)方式能夠服務(wù)器加快讀寫數(shù)據(jù)的速率,從而提高KV-Store系統(tǒng)的整體性能。其中,本發(fā)明實施例對“第二預(yù)設(shè)閾值”的具體取值以及取值的獲取方法不進行限定,例如,可以為該DeleteLogBuffer中能夠容納的目標Key的數(shù)量的最大值等。本發(fā)明實施例還提供了根據(jù)GET操作在Delete中記錄Key的技術(shù)方案,具體可以包括以下兩種可選的實現(xiàn)方式中:可選的實現(xiàn)方式一:接收攜帶有待查找Key的GET操作;在根據(jù)GET操作獲取到待查找Key對應(yīng)的最新Value后,確定待查找Key對應(yīng)的次新Value所在的SSTable,在所確定的SSTable對應(yīng)的DeleteLog中記錄該待查找Key。舉例而言,該可選的實現(xiàn)方式在服務(wù)器執(zhí)行完現(xiàn)有技術(shù)中的GET操作的觸發(fā)條件下,即服務(wù)器獲取到GET操作中攜帶的待查找Key對應(yīng)的最新Value的觸發(fā)條件下,確定該待查找Key對應(yīng)的次新Value所在的SSTable,從而在該SSTable對應(yīng)的DeleteLog中記錄該待查找Key。其中,步驟S301中的“非最新Value”在該可選的實現(xiàn)方式中具體體現(xiàn)為“次新Value”?!按檎襅ey對應(yīng)的最新Value”可以為MemTable或SSTable中的Value。服務(wù)器根據(jù)GET操作獲取待查找Key對應(yīng)的最 新Value的實現(xiàn)方法可以參考上文,此處不再贅述。服務(wù)器可以按照獲取待查找Key對應(yīng)的最新Value的方法,獲取待查找Key對應(yīng)的次新Value??蛇x的實現(xiàn)方式二:當KV-Store系統(tǒng)應(yīng)用于增量存儲場景時,接收攜帶有待查找鍵Key的GET操作;在根據(jù)該GET操作獲取到待查找Key對應(yīng)的最新Value后,確定該待查找Key對應(yīng)的最新Value所在的SSTable,在所確定的SSTable對應(yīng)的DeleteLog中記錄該待查找Key。其中,“增量存儲場景“的特點為:每個Key-Value對僅被GET一次,并且服務(wù)器在執(zhí)行GET操作之后,會產(chǎn)生針對該Key的新的Value,并執(zhí)行攜帶有該Key和該新的Value的PUT操作。在該可選的實現(xiàn)方式二中,在確定待壓實SSTable之后,該方法還可以包括:接收攜帶有該待查找Key的PUT操作。其中,“接收攜帶有該待查找Key的PUT操作”可以在執(zhí)行“接收攜帶有待查找鍵Key的讀GET操作”之后、且在執(zhí)行下一個GET操作或任意一個攜帶有除該待查找Key之外的其他Key的PUT操作之前的任一步驟中執(zhí)行。舉例而言,根據(jù)增量存儲場景的特點可知,服務(wù)器在執(zhí)行完GET(待查找Key)操作后會接著執(zhí)行PUT(待查找Key,新的Value)操作,這樣,在執(zhí)行完該PUT(待查找Key,新的Value)操作后,由該GET(待查找Key)操作得到的“最新Value”會成為次新Value。由此可知,該可選的實現(xiàn)方式二與上述可選的實現(xiàn)方式一的基本思想相同。需要說明的是,上述可選的實現(xiàn)方式一可以適用于增量存儲場景和非增量存儲場景中;并且,適用于“最新Value”在MemTable或SSTable中的場景中。該可選的實現(xiàn)方式二應(yīng)用于增量存儲場景中;并且,適用于“最新Value”在SSTable中的場景中。另外需要說明的是,在該可選的實現(xiàn)方式一、二與上述涉及“目標Key”的實現(xiàn)方式結(jié)合使用的場景中,該可選的實現(xiàn)方式一、二中的“待查找Key”即為上述“目標Key”。另外,該可選的實現(xiàn)方式一、二可以與本文中提供的任一種或多種其他可選的方式結(jié)合使用。具體的:上述“在所確定的SSTable對應(yīng)的DeleteLog中記錄該待查找Key”,可以包括:在所確定的SSTable對應(yīng)的DeleteLog中不包含該待查找Key時,在所確定的SSTable對應(yīng)的DeleteLog中記錄該待查找Key。具體實現(xiàn)時,當服務(wù)器出現(xiàn)故障時,其內(nèi)存中的數(shù)據(jù)會丟失,其外存中的數(shù)據(jù)不會丟失。本發(fā)明實施例還提供了當服務(wù)器出現(xiàn)故障并恢復(fù)后,如何創(chuàng)建待壓實SSTable對應(yīng)的BloomFilter(即BFd)。具體可以包括以下方式一和方式二:方式一:當服務(wù)器故障恢復(fù)后,將待壓實SSTable對應(yīng)的BloomFilter的初始值設(shè)置為空。舉例而言,當服務(wù)器故障恢復(fù)后,將待壓實SSTable對應(yīng)的BloomFilter的初始值設(shè)置為空;后續(xù)再按照上文提供的可選的實現(xiàn)方式向待壓實SSTable對應(yīng)的BloomFilter中寫入Key。需要說明的是,該方式一雖然在一定程度上會使得待壓實SSTable對應(yīng)的DeleteLog中記錄的Key出現(xiàn)重復(fù),但是,能夠保證在服務(wù)器在故障恢復(fù)后,按照上文提供的技術(shù)方案進行單文件壓實的過程中的正確率;另外,該方式一具有實現(xiàn)簡單的優(yōu)點。方式二:在KV-Store系統(tǒng)為分布式存儲系統(tǒng)、且待壓實SSTable對應(yīng)的DeleteLog為本地DeleteLog時,當服務(wù)器故障恢復(fù)后,根據(jù)全局DeleteLog中記錄的Key確定待壓實SSTable對應(yīng)的BloomFilter的初始值;其中,全局DeleteLog中記錄有該本地DeleteLog中的Key。舉例而言,當KV-Store系統(tǒng)為分布式存儲系統(tǒng)時,每個包含該KV-Store系統(tǒng)的進程的服務(wù)器可以在自身的外存中,為本地的每個SSTable創(chuàng)建一個DeleteLog,該DeleteLog可以稱為“本地DeleteLog”;另外,還可以在其中的一個或多個服務(wù)器中創(chuàng)建全局DeleteLog,用于記錄每個包含該KV-Store系統(tǒng)的進程的服務(wù)器中的本地DeleteLog中的Key,以實現(xiàn)對本地DeleteLog的備份。這樣,當其中一個或多個包含該KV-Store系統(tǒng)的進程的服務(wù)器故障恢復(fù)后,可以從全局DeleteLog中獲取該故障恢復(fù)的服務(wù)器中的本地DeleteLog中的Key。需要說明的是,具體實現(xiàn)時,包含KV-Store系統(tǒng)進程的每個服務(wù)器可以定期地或周期性地或觸發(fā)性地將本地DeleteLog寫入全局DeleteLog。另外,當其中的一個或多個服務(wù)器發(fā)生故障后,其他未發(fā)生故障的服務(wù)器可以將這些發(fā)生故障的服務(wù)器中的KV-Store系統(tǒng)數(shù)據(jù)轉(zhuǎn)移到自身的存儲單元中。本發(fā)明實施例對該轉(zhuǎn)移方式不進行限定,例如,可以通過 全局DeleteLog中記錄的信息等進行轉(zhuǎn)移。實施例二本實施例提供兩種在DeleteLog中記錄Key的方法。該兩種方法應(yīng)用于包含KV-Store系統(tǒng)的服務(wù)器中;該服務(wù)器中所涉及的數(shù)據(jù)結(jié)構(gòu)如圖4所示。圖4中的服務(wù)器包括內(nèi)存和外存;內(nèi)存中設(shè)置有一個MemTable、若干個BFs、若干個BFd和若干個DeleteLogBuffer;外存中設(shè)置有若干個SSTable和若干個DeleteLog。其中,每個SSTable對應(yīng)一個BFs;每個SSTable對應(yīng)一個DeleteLog,每個SSTable對應(yīng)一個BFd,每個DeleteLog對應(yīng)一個DeleteLogBuffer。需要說明的是,具體實現(xiàn)時,圖4所示的服務(wù)器中的每個SSTable還可以對應(yīng)一個或多個BlockIndex,圖4中未示出BlockIndex。在DeleteLog中記錄Key的方法一參見圖5,為本實施例提供的一種在DeleteLog中記錄Key的方法的流程示意圖。圖5所示的方法可以應(yīng)用于增量存儲場景和非增量存儲場景中。該方法可以包括以下步驟S501-S504:S501:在接收到攜帶有待查找Key的GET操作時,根據(jù)GET操作獲取待查找Key對應(yīng)的最新Value,并查找待查找Key對應(yīng)的次新Value。若查找到,則執(zhí)行步驟S502;若沒有查找到,則結(jié)束。S502:確定記錄有待查找Key對應(yīng)的次新Value的SSTable。S503:判斷所確定的SSTable對應(yīng)的BFd中是否記錄有該待查找Key。若是,說明待壓實SSTable對應(yīng)的DeleteLog中已經(jīng)記錄有該待查找Key,則結(jié)束;若否,則執(zhí)行步驟S504。S504:在所確定的SSTable對應(yīng)的BFd中記錄該待查找Key,并在所確定的SSTable對應(yīng)的DeleteLog中記錄該待查找Key。具體的,步驟S504可以包括:在待壓實SSTable對應(yīng)的BFd中記錄該待查找Key,并在待壓實SSTable對應(yīng)的DeleteLogBuffer中記錄該待查找Key;若該DeleteLogBuffer已滿,則將DeleteLogBuffer中 所記錄的Key寫入待壓實SSTable對應(yīng)的DeleteLog中。舉例而言,在該方法一中,服務(wù)器可以根據(jù)以下算法執(zhí)行GET(Key)上操作:需要說明的是,上述第5行代碼為服務(wù)器第一次查找到待查找Key,本次查找到的待查找Key對應(yīng)的Value為待查找Key對應(yīng)的最新Value; 另外該最新Value所在的SSTable為SSTable[i]。上述第10行代碼說明服務(wù)器第二次查找到待查找Key,本次查找到的待查找Key對應(yīng)的Value為待查找Key對應(yīng)的次新Value;另外該次新Value所在的SSTable為SSTable[j]。在DeleteLog中記錄Key的方法二參見圖6,為本實施例提供的另一種在DeleteLog中記錄Key的方法的流程示意圖。圖6所示的方法應(yīng)用于增量存儲場景中,該方法可以包括以下步驟S601-S604:S601:在接收到攜帶有待查找Key的GET操作時,根據(jù)GET操作獲取待查找Key對應(yīng)的最新Value。若查找到,則執(zhí)行步驟S602;若沒有查找到,則結(jié)束。S602:確定記錄有該最新Value的SSTable。S603-S604:與上述S503-S504相同。舉例而言,在該方法二中,服務(wù)器可以根據(jù)以下算法執(zhí)行增量存儲場景下的GET(Key)操作:增量存儲場景下的GET(Key)實施例三參見圖7,為本實施例提供的基于圖5或圖6的一種KV-Store系統(tǒng) 中文件壓實的方法的流程示意圖。圖7所示的方法包括以下步驟S701-S704:S701:判斷待壓實SSTable對應(yīng)的DeleteLog中的Key的數(shù)量是否大于或等于預(yù)設(shè)閾值。若是,則執(zhí)行步驟S702;若否,則結(jié)束。其中,“待壓實SSTable”可以為KV-Store系統(tǒng)所在的服務(wù)器中的任一個SSTable。具體實現(xiàn)時,服務(wù)器可以時刻或周期性地或觸發(fā)性地針對任一個SSTable執(zhí)行步驟S701。需要說明的是,若步驟S701的判斷結(jié)果為“否”,則服務(wù)器在執(zhí)行步驟S701的判斷操作之后不執(zhí)行對待壓實SSTable進行壓實的操作;該情況下,服務(wù)器可以繼續(xù)執(zhí)行上述圖5或圖6所示的在DeleteLog中記錄Key。S702:對待壓實SSTable對應(yīng)的DeleteLog中的Key進行排序。其中,該步驟中所執(zhí)行的“排序”是后續(xù)步驟S703中執(zhí)行“歸并”操作的基礎(chǔ)。S703:歸并待壓實SSTable和排序后的該DeleteLog,得到新的SSTable;其中,新的SSTable中記錄的Key-Value對為待壓實SSTable中的、且不屬于該DeleteLog中的Key對應(yīng)的Key-Value對。S704:刪除待壓實SSTable。舉例而言,步驟S703可以通過以下算法實現(xiàn):下面通過一個具體的示例對圖5提供的在DeleteLog中記錄Key的方法和基于圖5的KV-Store系統(tǒng)中文件壓實的方法進行示例性說明:假設(shè)某一時刻,KV-Store系統(tǒng)中的每個SSTable對應(yīng)的DeleteLog均為空,也就是說,每個DeleteLog中均未記錄任何一個Key;并且,此時KV-Store系統(tǒng)中的MemTable和SSTable中記錄的Key如表1所示:表1MemTable/SSTableKeyMemTableKey1、Key2、Key3SSTable1Key1、Key2、Key3、Key4、Key5SSTable2Key1、Key4、Key5、Key7、Key8SSTable3Key2、Key3、Key6、Key8、Key9基于表1,服務(wù)器在連續(xù)執(zhí)行GET(Key1)、GET(Key2)、GET(Key3)、GET(Key4)、GET(Key5)之后,KV-Store系統(tǒng)中的每個SSTable對應(yīng)的DeleteLog中的Key如表2所示:表2SSTableDeleteLogKeySSTable1DeleteLog1Key1、Key2、Key3SSTable2DeleteLog2Key4、Key5SSTable3DeleteLog3空假設(shè)“預(yù)設(shè)閾值”為3,那么,在表2中,DeleteLog1中Key的數(shù)量滿足“大于或等于預(yù)設(shè)閾值”;此時,服務(wù)器可以歸并SSTable1和DeleteLog1,歸并后得到新的SSTable1。該情況下,KV-Store系統(tǒng)中的MemTable和SSTable中記錄的Key如表3所示:表3MemTable/SSTableKeyMemTableKey1、Key2、Key3新的SSTable1Key4、Key5SSTable2Key1、Key4、Key5、Key7、Key8SSTable3Key2、Key3、Key6、Key8、Key9接著,基于表3,服務(wù)器在連續(xù)執(zhí)行GET(Key1)、GET(Key2)、GET(Key3)、GET(Key4)、GET(Key5)之后,KV-Store系統(tǒng)中的每個SSTable對應(yīng)的DeleteLog中的Key如表4所示:表4SSTableDeleteLogKey新的SSTable1新的DeleteLog1空SSTable2DeleteLog2Key1、Key4、Key5SSTable3DeleteLog3Key2、Key3假設(shè)“預(yù)設(shè)閾值”為3,那么,在表4中,DeleteLog2中Key的數(shù)量滿足“大于或等于預(yù)設(shè)閾值”;此時,服務(wù)器可以歸并SSTable2和DeleteLog2,歸并后得到新的SSTable2。該情況下,KV-Store系統(tǒng)中的MemTable和SSTable中記錄的Key如表5所示:表5MemTable/SSTableKeyMemTableKey1、Key2、Key3新的SSTable1Key4、Key5新的SSTable2Key7、Key8SSTable3Key2、Key3、Key6、Key8、Key9依此類推,服務(wù)器可以按照上述方法對所對應(yīng)的DeleteLog中的Key的數(shù)量滿足“大于或等于預(yù)設(shè)閾值”的任一個SSTable執(zhí)行壓實操作,從而實現(xiàn)節(jié)省存儲空間的目的。需要說明的是,根據(jù)該示例,本領(lǐng)域技術(shù)人員應(yīng)當能夠在不付出創(chuàng)造性的勞動下,得出圖6提供的在DeleteLog中記錄Key的方法和基于圖6的在KV-Store系統(tǒng)中文件壓實的方法的具體示例。需要說明的是,在上述任一實施例或可選的實現(xiàn)方式中,當多個SSTable共享一個DeleteLog時,可以將DeleteLog劃分為多個DeleteBlock,每個DeleteBlock用于記錄一個SSTable中的非最新Value所對應(yīng)的Key,一個SSTable中的非最新Value所對應(yīng)的Key可以分別被記錄在多個DeleteBlock中。其中,一個SSTable中的非最新Value所對應(yīng)的Key可以分別被記錄在DeleteLog中的連續(xù)的或非連續(xù)的多個DeleteBlock中。當一個SSTable中的非最新Value所對應(yīng)的Key被記錄在DeleteLog中的非連續(xù)的多個DeleteBlock中時,即一個SSTable對應(yīng)多個非連續(xù)的DeleteBlock時,服務(wù)器可以在內(nèi)存中保存每個SSTable對應(yīng)的最后一個DeleteBlock的位置,并在產(chǎn)生下一個DeleteBlock時,將上一個DeleteBlock的位置記錄進新的DeleteBlock,如此就形成了從后向前的單鏈。在需要讀取一個SSTable中的非最新Value所對應(yīng)的Key時,可以根據(jù)該單鏈,從后向前地讀取記錄該SSTable對應(yīng)的多個DeleteBlock中所記錄的Key。參見圖8,為本發(fā)明實施例提供的一種DeleteLog的結(jié)構(gòu)示意圖。圖8所示的DeleteLog中,一個SSTable對應(yīng)多個非連續(xù)的DeleteBlock。其中,SSTable[i]表示第i個SSTable,SSTable[j]表示第j個SSTable;i、j均為大于或等于0的整數(shù),且i不等于j。實施例四參見圖9,為本發(fā)明實施例提供的一種服務(wù)器的結(jié)構(gòu)示意圖。圖9所示的服務(wù)器用于執(zhí)行上述提供的任一種KV-Store系統(tǒng)中文件壓實的方法。本實施例中相關(guān)內(nèi)容的解釋可以參考上述方法實施例,此處不再贅述。圖9所示的服務(wù)器9包含KV-Store系統(tǒng),該服務(wù)器9可以包括:壓 實單元91和刪除單元92。具體的:壓實單元91,用于根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable;其中,所述DeleteLog中記錄有所述待壓實SSTable中保存的所述KV-Store系統(tǒng)中的非最新值Value所對應(yīng)的鍵Key,所述新的SSTable中不包含所述DeleteLog中的Key對應(yīng)的Key-Value對。刪除單元92,用于刪除所述待壓實SSTable??蛇x的,如圖10所示,所述服務(wù)器9還可以包括:第一確定單元93,用于在所述待壓實SSTable中,確定所述KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,作為目標Key;記錄單元94,用于在所述DeleteLog中記錄所述目標Key。舉例而言,所述記錄單元96具體可以用于:在確定所述DeleteLog中不包含所述目標Key時,在所述DeleteLog中記錄所述目標Key??蛇x的,所述壓實單元91具體可以用于:拷貝所述待壓實SSTable中的、且不屬于所述DeleteLog中的Key對應(yīng)的Key-Value,生成新的SSTable。在一種可選的實現(xiàn)方式中,如圖10所示,所述服務(wù)器1還可以包括:接收單元95,用于接收攜帶有待查找Key的讀GET操作;第二確定單元96,用于在根據(jù)所述GET操作獲取到所述待查找Key對應(yīng)的最新Value后,確定所述待查找Key對應(yīng)的次新Value所在的SSTable,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key。在另一種可選的實現(xiàn)方式中,所述KV-Store系統(tǒng)應(yīng)用于增量存儲場景,該情況下,如圖10所示,所述服務(wù)器1還可以包括:接收單元95,用于接收攜帶有待查找Key的讀GET操作;第二確定單元96,用于在根據(jù)所述GET操作獲取到所述待查找Key對應(yīng)的最新Value后,確定所述待查找Key對應(yīng)的最新Value所在的SSTable,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key;所述接收單元95還可以用于,接收攜帶有所述待查找Key的PUT操作。舉例而言,在上述兩種可選的實現(xiàn)方式中,所述第二確定單元96在 執(zhí)行在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key時,具體用于:在所述確定的SSTable對應(yīng)的DeleteLog中不包含所述待查找Key時,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key??蛇x的,所述壓實單元91具體可以用于:當待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog中的Key的數(shù)量大于或等于預(yù)設(shè)閾值時,根據(jù)所述DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable??蛇x的,所述待壓實SSTable對應(yīng)一個布隆過濾器BloomFilter;所述BloomFilter中記錄有所述DeleteLog中的Key,如圖10所示,所述服務(wù)器9還可以包括:第三確定單元97,用于:當所述KV-Store系統(tǒng)所在的服務(wù)器故障恢復(fù)后,將所述BloomFilter的初始值設(shè)置為空;或,在所述KV-Store系統(tǒng)為分布式存儲系統(tǒng)、且所述DeleteLog為本地DeleteLog時,當所述KV-Store系統(tǒng)所在的服務(wù)器故障恢復(fù)后,根據(jù)全局DeleteLog中記錄的Key確定所述BloomFilter的初始值;其中,所述全局DeleteLog中記錄有所述本地DeleteLog中的Key。本實施例提供的服務(wù)器,根據(jù)待壓實SSTable對應(yīng)的DeleteLog,對待壓實SSTable進行壓實,生成新的SSTable;其中,該DeleteLog中記錄有待壓實SSTable中保存的KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,該新的SSTable中不包含該DeleteLog中的Key對應(yīng)的Key-Value對;然后,刪除該待壓實SSTable,從而實現(xiàn)了單文件壓實。該方法中,每次壓實操作時只需要讀取一個SSTable中的數(shù)據(jù);相比現(xiàn)有技術(shù)中的多文件壓實的方法,需要占用的I/O帶寬和內(nèi)存資源較小,這樣,在利用該方法執(zhí)行壓實操作的同時,可以為其他操作預(yù)留更多的資源,以不影響執(zhí)行其他操作的速率,從而提升了用戶體驗。實施例五在硬件實現(xiàn)上,上述實施例四中的壓實單元91、刪除單元92、第一確定單元93、記錄單元94、接收單元95、第二確定單元96和第三確定單元97中的一種或幾種以硬件形式內(nèi)嵌于或獨立于服務(wù)器9的處理器中, 也可以以軟件形式存儲于服務(wù)器9的存儲器中,以便于處理器調(diào)用執(zhí)行以上各個模塊對應(yīng)的操作,該處理器可以為中央處理單元(CPU,CentralProcessingUnit)、微處理器、單片機等。參見圖11,為本發(fā)明實施例提供的一種服務(wù)器的結(jié)構(gòu)示意圖。圖11所示的服務(wù)器用于執(zhí)行上述提供的任一種KV-Store系統(tǒng)中文件壓實的方法。本實施例中相關(guān)內(nèi)容的解釋可以參考上述方法實施例,此處不再贅述。圖11所示的服務(wù)器11包含KV-Store系統(tǒng),該服務(wù)器11可以包括:存儲器11A、處理器11B、無線接口11C和總線系統(tǒng)11D。其中,存儲器11A、處理器11B和無線接口11C之間是通過總線系統(tǒng)11D耦合在一起的。存儲器11A可能包含高速RAM(RandomAccessMemory,隨機存取存儲器),也可能包含非易失性存儲器(non-volatilememory),例如至少一個磁盤存儲器。無線接口11C用于所述服務(wù)器11與其他設(shè)備進行通信??偩€系統(tǒng)11D可以是ISA(IndustryStandardArchitecture,工業(yè)標準體系結(jié)構(gòu))總線、PCI(PeripheralComponent,外部設(shè)備互連)總線或EISA(ExtendedIndustryStandardArchitecture,擴展工業(yè)標準體系結(jié)構(gòu))總線等;總線系統(tǒng)11D除包括數(shù)據(jù)總線之外,還可以包括電源總線、控制總線和狀態(tài)信號總線等。但是為了清楚說明起見,在圖中將各種總線都標為總線系統(tǒng)11D。存儲器11A,用于存放程序。具體地,程序可以包括程序代碼,所述程序代碼包括計算機操作指令。處理器11B執(zhí)行所述存儲器11A中存放的程序,以實現(xiàn)本發(fā)明實施例提供的KV-Store系統(tǒng)中文件壓實的方法。具體可以包括:根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable;其中,所述DeleteLog中記錄有所述待壓實SSTable中保存的所述KV-Store系統(tǒng)中的非最新值Value所對應(yīng)的鍵Key,所述新的SSTable中不包含所述DeleteLog中的Key對應(yīng)的Key-Value對;刪除所述待壓實SSTable??蛇x的,處理器11B還可以用于:在所述待壓實SSTable中,確定所述KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,作為目標Key;在所述DeleteLog中記錄所述目標Key。舉例而言,處理器11B在執(zhí)行所述DeleteLog中記錄所述目標Key時,具體可以用于:在確定所述DeleteLog中不包含所述目標Key時,在所述DeleteLog中記錄所述目標Key??蛇x的,處理器11B在執(zhí)行根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable時,具體可以用于:拷貝所述待壓實SSTable中的、且不屬于所述DeleteLog中的Key對應(yīng)的Key-Value,生成新的SSTable。在一種可選的實現(xiàn)方式中,所述處理器11B還可以用于:接收攜帶有待查找Key的讀GET操作;并在根據(jù)所述GET操作獲取到所述待查找Key對應(yīng)的最新Value后,確定所述待查找Key對應(yīng)的次新Value所在的SSTable,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key。在另一種可選的實現(xiàn)方式中,所述KV-Store系統(tǒng)應(yīng)用于增量存儲場景,所述處理器11B還可以用于:接收攜帶有待查找Key的讀GET操作;并在根據(jù)所述GET操作獲取到所述待查找Key對應(yīng)的最新Value后,確定所述待查找Key對應(yīng)的最新Value所在的SSTable,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key;以及接收攜帶有所述待查找Key的PUT操作。舉例而言,在上述兩種可選的實現(xiàn)方式中,所述處理器11B在執(zhí)行在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key時,具體用于:在所述確定的SSTable對應(yīng)的DeleteLog中不包含所述待查找Key時,在所述確定的SSTable對應(yīng)的DeleteLog中記錄所述待查找Key??蛇x的,處理器11B在執(zhí)行根據(jù)待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable時,具體可以用于:當待壓實有序字符串表SSTable對應(yīng)的待刪除日志DeleteLog中的Key的數(shù)量大于或等于預(yù)設(shè)閾值時,根據(jù)所述DeleteLog,對所述待壓實SSTable進行壓實,生成新的SSTable??蛇x的,所述待壓實SSTable對應(yīng)一個布隆過濾器BloomFilter;所述BloomFilter中記錄有所述DeleteLog中的Key,處理器11B還可以用于:當所述KV-Store系統(tǒng)所在的服務(wù)器故障恢復(fù)后,將所述BloomFilter的初始值設(shè)置為空;或,在所述KV-Store系統(tǒng)為分布式存儲系統(tǒng)、且所述DeleteLog為本地DeleteLog時,當所述KV-Store系統(tǒng)所在的服務(wù)器故障恢復(fù)后,根據(jù)全局DeleteLog中記錄的Key確定所述BloomFilter的初始值;其中,所述全局DeleteLog中記錄有所述本地DeleteLog中的Key。本實施例提供的服務(wù)器,根據(jù)待壓實SSTable對應(yīng)的DeleteLog,對待壓實SSTable進行壓實,生成新的SSTable;其中,該DeleteLog中記錄有待壓實SSTable中保存的KV-Store系統(tǒng)中的非最新Value所對應(yīng)的Key,該新的SSTable中不包含該DeleteLog中的Key對應(yīng)的Key-Value對;然后,刪除該待壓實SSTable,從而實現(xiàn)了單文件壓實。該方法中,每次壓實操作時只需要讀取一個SSTable中的數(shù)據(jù);相比現(xiàn)有技術(shù)中的多文件壓實的方法,需要占用的I/O帶寬和內(nèi)存資源較小,這樣,在利用該方法執(zhí)行壓實操作的同時,可以為其他操作預(yù)留更多的資源,以不影響執(zhí)行其他操作的速率,從而提升了用戶體驗。所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統(tǒng),裝置和單元的具體工作過程,可以參考前述方法實施例中的對應(yīng)過程,在此不再贅述。在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和方法,可以通過其它的方式實現(xiàn)。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地 方,或者也可以分布到多個網(wǎng)絡(luò)單元上。可以根據(jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。另外,在本發(fā)明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理包括,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用硬件加軟件功能單元的形式實現(xiàn)。上述以軟件功能單元的形式實現(xiàn)的集成的單元,可以存儲在一個計算機可讀取存儲介質(zhì)中。上述軟件功能單元存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的部分步驟。而前述的存儲介質(zhì)包括:U盤、移動硬盤、ROM(Read-OnlyMemory,只讀存儲器)、RAM、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。最后應(yīng)說明的是:以上實施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照前述實施例對本發(fā)明進行了詳細的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當理解:其依然可以對前述各實施例所記載的技術(shù)方案進行修改,或者對其中部分技術(shù)特征進行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實施例技術(shù)方案的精神和范圍。當前第1頁1 2 3 
當前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
荔浦县| 万年县| 赤峰市| 莱芜市| 西华县| 桦南县| 正定县| 包头市| 石楼县| 昌吉市| 延津县| 浮梁县| 广丰县| 景德镇市| 常宁市| 安新县| 绥中县| 柳林县| 麟游县| 蒲江县| 禹城市| 师宗县| 长丰县| 靖州| 新晃| 朝阳县| 淄博市| 上林县| 尚义县| 延长县| 南郑县| 临夏县| 垫江县| 望城县| 湟中县| 穆棱市| 泸水县| 云霄县| 平乡县| 安丘市| 米易县|