亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種基于鍵排序的數(shù)據(jù)存儲方法和裝置制造方法

文檔序號:6492932閱讀:137來源:國知局
一種基于鍵排序的數(shù)據(jù)存儲方法和裝置制造方法【專利摘要】本發(fā)明實施方式提出了一種基于鍵(Key)排序的數(shù)據(jù)存儲方法和裝置。方法包括:在第一數(shù)據(jù)塊中存儲定長鍵及其值,其中所述存儲定長鍵包括:統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分;在第二數(shù)據(jù)塊存儲變長鍵及其值,其中所述存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。本發(fā)明實施方式可以有效減小數(shù)據(jù)的存儲空間,提高機器磁盤利用率,還可以有利于IO和解析的力度??梢砸罁?jù)索引塊以及數(shù)據(jù)塊內(nèi)部的有序性,快速定位查詢的數(shù)據(jù),從而提高查詢效率?!緦@f明】一種基于鍵排序的數(shù)據(jù)存儲方法和裝置【
技術(shù)領(lǐng)域
】[0001]本發(fā)明實施方式涉及信息處理【
技術(shù)領(lǐng)域
】,更具體地,涉及一種基于鍵(Key)排序的數(shù)據(jù)存儲方法和裝置?!?br>背景技術(shù)
】[0002]在當今的信息時代中,各種信息設(shè)備應(yīng)運而生:有用于話音傳輸?shù)墓潭娫挕⒁苿与娫?;有用于信息資源共享、處理的服務(wù)器和個人電腦;有用于視頻數(shù)據(jù)顯示的各種電視機等等。這些設(shè)備都是在特定領(lǐng)域內(nèi)為解決實際的需求而產(chǎn)生的。隨著電子消費、計算機、通信(3C)融合的到來,人們越來越多地將注意力放到了對各個不同領(lǐng)域的信息設(shè)備進行綜合利用的研究上,以充分利用現(xiàn)有資源設(shè)備來為人們更好的服務(wù)。[0003]Key-value分布式存儲系統(tǒng)具有查詢速度快、存放數(shù)據(jù)量大、支持高并發(fā)等優(yōu)點,非常適合通過主鍵進行查詢,但不能進行復(fù)雜的條件查詢。如果輔以Real-TimeSearchEngine(實時搜索引擎)進行復(fù)雜條件檢索、全文檢索,就可以替代并發(fā)性能較低的MySQL等關(guān)系型數(shù)據(jù)庫,達到高并發(fā)、高性能,節(jié)省幾十倍服務(wù)器數(shù)量的目的。以MemcacheDB'TokyoTyrant為代表的Key-value分布式存儲,在上萬并發(fā)連接下,輕松地完成高速查詢。[0004]在目前有序Key的存儲技術(shù)中,現(xiàn)有技術(shù)方案是以單個Key為存儲單位,很難選取一個基準Key進行前綴壓縮,導(dǎo)致壓縮效率低,而且存儲空間的利用率很低。[0005]而且,在現(xiàn)有技術(shù)的數(shù)據(jù)壓縮技術(shù)中,當需要讀取數(shù)據(jù)時,需要遍歷整個文件,解析力度大,而且定位查詢速度慢?!?br/>發(fā)明內(nèi)容】[0006]本發(fā)明實施方式提出一種鍵排序的數(shù)據(jù)存儲方法,從而提高存儲空間的利用率。[0007]本發(fā)明實施方式還提出一種鍵排序的數(shù)據(jù)存儲裝置,從而提高存儲空間的利用率,從而提聞提醒事務(wù)的處理效率。[0008]本發(fā)明實施方式的具體方案如下:[0009]一種基于鍵排序的數(shù)據(jù)存儲方法,該方法包括:[0010]在第一數(shù)據(jù)塊中存儲定長鍵及其值,其中所述存儲定長鍵包括:統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分;[0011]在第二數(shù)據(jù)塊存儲變長鍵及其值,其中所述存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。[0012]一種基于鍵排序的數(shù)據(jù)存儲裝置,該裝置包括定長鍵存儲單元和變長鍵存儲單元,其中:[0013]定長鍵存儲單元,用于在在第一數(shù)據(jù)塊中存儲定長鍵及其值,其中所述存儲定長鍵包括:統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分;[0014]變長鍵存儲單元,用于在第二數(shù)據(jù)塊存儲變長鍵及其值,其中所述存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。[0015]從上述技術(shù)方案可以看出,在本發(fā)明實施方式中,在第一數(shù)據(jù)塊中存儲定長鍵及其值,其中所述存儲定長鍵包括:統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分;在第二數(shù)據(jù)塊存儲變長鍵及其值,其中所述存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。由此可見,應(yīng)用本發(fā)明實施方式之后,變長鍵數(shù)據(jù)塊內(nèi)采用前綴壓縮方式,以及優(yōu)選對每個數(shù)據(jù)塊進行壓縮,因此可以有效減小數(shù)據(jù)的存儲空間,提高機器磁盤利用率。[0016]另外,不同于現(xiàn)有技術(shù)中以單個Key為存儲單位,本發(fā)明實施方式以數(shù)據(jù)塊為存儲單元,因此可以有利于IO和解析的力度。[0017]而且,本發(fā)明實施方式在讀取數(shù)據(jù)時,可以依據(jù)索引塊以及數(shù)據(jù)塊內(nèi)部的有序性,快速定位查詢的數(shù)據(jù),從而提高查詢效率。【專利附圖】【附圖說明】[0018]圖1為根據(jù)本發(fā)明實施方式的鍵排序的數(shù)據(jù)存儲方法流程圖;[0019]圖2為根據(jù)本發(fā)明實施方式的文件格式示意圖;[0020]圖3為根據(jù)本發(fā)明實施方式的數(shù)據(jù)塊的變長Key的寫入示意圖;[0021]圖4為根據(jù)本發(fā)明實施方式的數(shù)據(jù)塊的定長Key的寫入示意圖;[0022]圖5為根據(jù)本發(fā)明實施方式的布隆過濾器的存儲結(jié)構(gòu)示意圖;[0023]圖6為根據(jù)本發(fā)`明實施方式的索引塊(BlockIndex)的存儲結(jié)構(gòu)示意圖;[0024]圖7為根據(jù)本發(fā)明實施方式的文件頭(Header)的存儲結(jié)構(gòu)示意圖;[0025]圖8為根據(jù)本發(fā)明實施方式的記錄(record)數(shù)據(jù)寫入流程示意圖;[0026]圖9為根據(jù)本發(fā)明實施方式的讀取順序示意圖;[0027]圖10為根據(jù)本發(fā)明實施方式的記錄(record)數(shù)據(jù)讀取流程示意圖;[0028]圖11為根據(jù)本發(fā)明實施方式的鍵排序的數(shù)據(jù)存儲裝置結(jié)構(gòu)圖?!揪唧w實施方式】[0029]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面結(jié)合附圖對本發(fā)明作進一步的詳細描述。[0030]在本發(fā)明實施方式中提出一種數(shù)據(jù)持久化的文件格式,可以基于key排序,支持定長、變長key以及值(value),而且key可以帶前綴壓縮。而且,在本發(fā)明實施方式中,以數(shù)據(jù)塊(block)為存儲單位,有利于IO和解析的力度。[0031]優(yōu)選在本發(fā)明實施方式的數(shù)據(jù)塊內(nèi)采用前綴壓縮方式以及對每個數(shù)據(jù)塊進行壓縮,從而有效減小數(shù)據(jù)的存儲空間,并提高機器磁盤利用率,當讀取數(shù)據(jù)時,可以依據(jù)索引塊以及數(shù)據(jù)塊內(nèi)部的有序性,快速定位查詢的數(shù)據(jù)。[0032]圖1為根據(jù)本發(fā)明實施方式的鍵排序的數(shù)據(jù)存儲方法流程圖。[0033]如圖1所示,該方法包括:[0034]步驟101:在第一數(shù)據(jù)塊中存儲定長鍵及其值,其中所述存儲定長鍵包括--統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分。[0035]步驟102:在第二數(shù)據(jù)塊存儲變長鍵及其值,其中所述存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。[0036]其中,在本發(fā)明實施方式中,針對步驟101和步驟102的執(zhí)行順序并無任何限定。[0037]在這里,第一數(shù)據(jù)塊專門用于存儲定長鍵及其值,第二數(shù)據(jù)塊專門用于存儲變長鍵及其值。[0038]在上述方法中,優(yōu)選一步包括:根據(jù)預(yù)先設(shè)置的閾值長度和閾值差分將變長鍵劃分為基準鍵類型和前綴壓縮鍵類型,其中:[0039]將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串小于所述閾值長度,則判定該當前變長鍵為基準鍵類型;[0040]將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串大于所述閾值長度與閾值差分的和,則判定該當前變長鍵為基準鍵類型;[0041]將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串大于所述閾值長度而小于所述閾值長度與閾值差分的和,則判定該當前變長鍵為前綴壓縮鍵類型。[0042]優(yōu)選地,前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮包括:[0043]針對前綴壓縮鍵類型的變長鍵,存儲該前綴壓縮鍵類型的變長鍵與上一個基準鍵的公共前綴的長度,以及存儲該前綴壓縮鍵類型的變長鍵去除該公共前綴后的剩余部分。[0044]在一個實施方式中,當判定將定長鍵及其值存儲到第一數(shù)據(jù)塊失敗時,壓縮所述第一數(shù)據(jù)塊,并分配存儲緩沖區(qū);當壓縮后第一數(shù)據(jù)塊的大小小于所述存儲緩沖區(qū)時,將所述壓縮后第一數(shù)據(jù)塊寫入所述存儲緩沖區(qū);[0045]當判定將變長鍵及其值存儲到第二數(shù)據(jù)塊失敗時,壓縮所述第二數(shù)據(jù)塊,并分配存儲緩沖區(qū);當壓縮后第二數(shù)據(jù)塊的大小小于所述存儲緩沖區(qū)時,將所述壓縮后第二數(shù)據(jù)塊寫入所述存儲緩沖區(qū)。[0046]更優(yōu)選地,該方法進一步包括:[0047]當判定將定長鍵及其值存儲到第一數(shù)據(jù)塊成功時,將所述定長鍵及其值的布隆過濾器信息寫入到布隆過濾器中;[0048]當判定將變長鍵及其值存儲到第二數(shù)據(jù)塊成功時,將所述定長鍵及其值的布隆過濾器信息寫入到布隆過濾器中。[0049]在一個實施方式中,可以設(shè)置讀取緩沖區(qū),并當判定該讀取操作的讀取長度小于所述緩沖區(qū)且該當前數(shù)據(jù)塊不是最后數(shù)據(jù)塊時,取出下一數(shù)據(jù)塊的起始地址并記錄下一數(shù)據(jù)塊的長度并繼續(xù)讀取,直到讀取長度大于所述緩沖區(qū)的長度為止。[0050]圖2為根據(jù)本發(fā)明實施方式的文件格式示意圖。[0051]如圖2所示,文件格式由數(shù)據(jù)塊(包括數(shù)據(jù)塊1、數(shù)據(jù)塊2,一直到數(shù)據(jù)塊η)、布隆過濾器,索引塊,文件頭部(包括文件頭和文件頭長度)組成。[0052]在數(shù)據(jù)塊部分存儲有序的記錄(record),該記錄分為Key和值(value)。對于Key部分,可以劃分為定長Key和變長Key。[0053]可以將同一類型的Key及其Value存放在相同的數(shù)據(jù)塊中,比如在數(shù)據(jù)塊I專門存放定長Key及其Value;在數(shù)據(jù)塊2專門存放變長Key及其Value,等等。而且,專門存放同一類型的Key及其Value的數(shù)據(jù)塊的數(shù)目可以有多個。[0054]在存放定長Key及其Value的數(shù)據(jù)塊中,對于各個定長Key的公共前綴(prefix)優(yōu)選只存一份,而針對每個key只存該key去除公共前綴后的剩余部分(即不同部門remainder)。[0055]在存放變長Key及其Value的數(shù)據(jù)塊,可以依據(jù)預(yù)先設(shè)定的閾值長度(thresholdlength)和閾值差分(thresholddiff)區(qū)分基準(base)key和前綴壓縮(prefixcompressed)key。對于basekey,執(zhí)行全量存儲;對于prefixcompressedkey,則存該當前prefixcompressedkey與前一個basekey的prefix長度(變長整型壓縮),然后存放該prefixcompressedkey的remainder部分。[0056]存放定長Key及其Value的數(shù)據(jù)塊以及存放變長Key及其Value的數(shù)據(jù)塊中,對于value部分(變長),可以存放隸屬于同一個key的所有cell的壓縮結(jié)果。[0057]基于圖1所示文件結(jié)構(gòu),當所有的block存滿記錄(record)后,順序?qū)懭胛募?。如果該block常駐內(nèi)存(常駐內(nèi)存的block,需要文件寫入器(比如:SSTablewriter)來進行管理,若SSTablewriter消失,則常駐內(nèi)存的block也消失,需要用戶構(gòu)建SSTable讀取器SSTablereader,調(diào)用SSTablewriter的Assign方法swapout已dump的block),則分配block,將blockhold在SSTablewriter中;如果該block不常駐內(nèi)存,則直接dumpblock到SSTable0[0058]當所有block寫完之后,會寫入文件的元數(shù)據(jù)(即bloomfilter,blockindex,header,headerlength信息),此時文件寫入器(writer)寫入完畢。[0059]圖3為根據(jù)本發(fā)明實施方式的數(shù)據(jù)塊的變長Key的寫入示意圖。[0060]由圖3可見,基于本發(fā)明實施方式文件格式的block在進行寫入(push)record時,需要分配臨時空間用來存儲鍵偏移(keyoffet),基準偏移(baseoffet),鍵(key),數(shù)據(jù)偏移(dataoffset)和數(shù)據(jù)(data)。[0061](I)當在寫入第一條記錄record時,設(shè)置當前Key、Data在Keyoffset,Dataoffset臨時分配區(qū)域的偏移量(第一條時,偏移量為0),并計算當前key是否可以成為basekey,如果可以則記錄baseoffset`(當前key為基準進行壓縮,此key不進行壓縮),并將key,data存放到臨時分配區(qū)。[0062](2)每次push—條記錄時,將當前key與前一條記錄的基準key進行前綴比較(獲取前一條記錄的base<^€861:,相同前綴串大于閾值(1:11^81101(1_1611,可設(shè)置)時,進行前綴壓縮,該key對應(yīng)的baseoffset中存放前一條記錄的基準Key的偏移,得到壓縮后相同前綴的長度(varint表示),然后在key臨時分配區(qū)內(nèi),接著上次寫入的結(jié)束位置,寫入相同前綴的長度(varint表示)和不同部分的key;在dataoffset,data臨時分配區(qū)寫入data的偏移和data數(shù)據(jù)。[0063](3)每次push—條記錄時,將當前key與前一條記錄的基準key進行前綴比較,相同前綴串小于閾值時,不進行前綴壓縮,該key為基準key進行存儲,baseoffset中設(shè)為當前key的偏移(當前key為基準進行壓縮,此key不進行壓縮),然后在key臨時分配區(qū)內(nèi),接著上次寫入的結(jié)束位置,寫入key;在dataoffset,data臨時分配區(qū)寫入data的偏移和data數(shù)據(jù)[0064](4)在每次push—條記錄時,計算block存儲區(qū)已使用的空間大小,臨時分配空間區(qū)域的大小之和,若大于blocksize,則該block已經(jīng)寫滿,當前record未寫入。此時,考慮是否將baseoffset,key,dataoffset,data臨時分配的區(qū)域?qū)懭隻lock未使用的區(qū)域。[0065]圖4為根據(jù)本發(fā)明實施方式的數(shù)據(jù)塊的定長Key的寫入示意圖。[0066]如圖4所示,每次Push—條記錄時,計算當前已經(jīng)push記錄的最長公共串,當block寫滿時,已求出最長公共串的長度以及最長公共串,block內(nèi)存的存儲結(jié)構(gòu)是先存儲最長公共串,接著存放每個key的剩余串,然后存放data數(shù)據(jù),最后存放頭部blockheader。[0067]對于基于本發(fā)明實施方式的文件格式的數(shù)據(jù)塊的讀取(get)操作,主要包括:當在進行g(shù)etrecord時,依據(jù)record的索引,在block中進行查找;或者依據(jù)key在block中查找record對應(yīng)索引。[0068](I)根據(jù)record索引,找到key的offset和baseoffset,依據(jù)baseoffset可以判斷當前記錄record的key是否進行過前綴壓縮,若未進行前綴壓縮,則直接讀取key;若進行前綴壓縮,則依據(jù)baseoffset找到basekey,和當前存儲key的位置獲取前綴串的長度(varint),然后還原key。[0069](2)根據(jù)record索引,找到data的offset,獲取當前記錄的data域。[0070](3)根據(jù)key查找record索引,主要依據(jù)二分查找進行快速定位。[0071]圖5為根據(jù)本發(fā)明實施方式的布隆過濾器的存儲結(jié)構(gòu)示意圖。[0072]如圖5所示,bloomfilter是一個特殊的退化HashTable。退化到不處理Collision,不存儲Key值;bloomfilter可以設(shè)置hash次數(shù),依據(jù)hash次數(shù),以及每條record的key計算該記錄在bitmap中的位置,并進行設(shè)置。[0073]在讀取記錄時,依據(jù)bloomfilter進行第一層的過濾,根據(jù)hash次數(shù),以及每條record的key計算該記錄對應(yīng)bitmap中的位置是否被設(shè)置為I,如果不為I,這當前的key不存在文件中,若為I,則可能存在文件中,并依據(jù)文件中blockindex的endkey在文件中查找。[0074]圖6為根據(jù)本發(fā)明實施方式的索引塊(BlockIndex)的存儲結(jié)構(gòu)示意圖。[0075]如圖6所示,blockindex的存儲方式(變長key,定長value)與block的存儲方式相似。key字段為cellkey,存儲每個數(shù)據(jù)塊的最后一條cell的全量key(行鍵(rowkey)+cfid+column),value字段是數(shù)據(jù)塊在文件中的偏移(offsetlength),以及當前rowkey的長度(rowkeylength)。[0076]圖7為根據(jù)本發(fā)明實施方式的文件頭(Header)的存儲結(jié)構(gòu)示意圖。[0077]文件頭存放文件相關(guān)信息以及各個部分的偏移和長度,有利于快速定位各個部分,省去從文件開始進行遍歷導(dǎo)致的系統(tǒng)資源浪費。[0078]如圖7所示,在該文件頭中可以設(shè)置:[0079](I)文件寫入record的KV類型;[0080](2)每個block的壓縮方法;[0081](3)對固定長度的key,為Key的長度;對非固定長度的Key,為O;[0082](4)對固定長度的data,該值為data的長度;非固定長度的,為O;[0083](5)用于非定長key選取basekey的;與上一個basekey的公共前綴串長度閾值;[0084](6)用于非定長key選取basekey的閾值;表示與前一個key的公共前綴串長度和與當前basekey的公共前綴串長度的差值;[0085](7)文件id號;[0086](8)文件是否常駐內(nèi)存;[0087](9)tableno號;[0088](IO)LGid號;[0089](11)sstable的記錄數(shù);[0090](12)sstable壓縮前的長度;[0091](13)sstable壓縮后的長度;[0092](14)block的大?。籟0093](15)索引塊的壓縮后的長度;[0094](16)索引塊壓縮前的長度;[0095](17)索引塊的偏移量;[0096](18)bloomfilter塊的偏移量;[0097](19)bloomfilter塊的長度;[0098](20)bloomfilter的hash數(shù)目;[0099](21)bloomfilter的沖突概率;[0100](22)sstable創(chuàng)建時戮;[0101](23)sstablerow的數(shù)目;[0102](24)sstablecell的數(shù)目。[0103]基于上述詳細描述,本發(fā)明提出了一種記錄數(shù)據(jù)的寫入方法。[0104]在本發(fā)明實施方式中,首先寫入record到Block中;若寫入成功,貝U寫當前record的bloomfilter信息到bloomfilter結(jié)構(gòu);若寫入失敗,則表明當前Block數(shù)據(jù)已滿,壓縮當前Block,依據(jù)writebuffer中未使用空間大小和Block的大小,分配合適的writebuffer,若當前writebuffer空間足夠,則將Block寫入writebuffer即可;若writebuffer空間不足時,則將現(xiàn)有的writebuffer進行寫入磁盤。writebuffer相等于一層cache,緩存已經(jīng)寫入的若干個Block,—次性的寫入多個Block到磁盤。[0105]其中,每次Block寫入的過程,都會將該Block最后一條key記錄寫入BlockIndex結(jié)構(gòu)。[0106]當所有的record寫完后,bloomfilter和BlockIndex已經(jīng)產(chǎn)生,依次寫入bloomfilter和BlockIndex,并將bloomfilter和BlockIndex的位置信息記錄到SSTableHeader里面。[0107]接著,文件頭(Header)寫磁盤。)最后,記錄文件頭長度(HeaderLength)到磁盤。[0108]寫入流程也是一次性寫入多個Block塊,減少與磁盤的交互,加速寫入速度。[0109]圖8為根據(jù)本發(fā)明實施方式的記錄(record)數(shù)據(jù)寫入流程示意圖。[0110]如圖8所示,該方法包括:[0111]步驟801:將記錄寫入當前的數(shù)據(jù)塊(block),其中對于定長鍵所對應(yīng)的記錄寫入專門存儲定長鍵及其值的數(shù)據(jù)塊,對于變長鍵所對應(yīng)的記錄寫入專門存儲變長鍵及其值的數(shù)據(jù)塊。存儲定長鍵包括:在專門存儲定長鍵及其值的數(shù)據(jù)塊中,統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分;在專門存儲變長鍵及其值的數(shù)據(jù)塊中,存儲變長鍵及其值,其中存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。[0112]步驟802:判斷步驟801中的記錄寫入是否成功,如果是則執(zhí)行步驟811及其后續(xù)步驟;否則執(zhí)行步驟803及其后續(xù)步驟。[0113]步驟803:判斷當前數(shù)據(jù)塊是否為空,如果是則返回參數(shù)錯誤,并退出本流程,如果不為空則執(zhí)行步驟804及其后續(xù)步驟。[0114]步驟804:壓縮當前的數(shù)據(jù)塊。[0115]步驟805:判斷當前數(shù)據(jù)塊壓縮是否成功,如果不成功,則返回壓縮出錯,并退出本流程,如果成功,則執(zhí)行步驟806及其后續(xù)流程。[0116]步驟806:判斷當前緩沖區(qū)(write_buffer)是否為空且當前塊壓縮后是否大于緩沖區(qū)的大小,如果是則執(zhí)行步驟808及其后續(xù)步驟,否則執(zhí)行步驟807及其后續(xù)步驟。[0117]步驟807:判斷剩余空間是否能寫入當前的數(shù)據(jù)塊,如果是則執(zhí)行步驟810及其后續(xù)步驟,否則執(zhí)行步驟809及其后續(xù)步驟。[0118]步驟808:重新申請緩沖區(qū)空間,并執(zhí)行步驟810及其后續(xù)步驟。[0119]步驟809:啟動dump,并結(jié)束本流程。[0120]步驟810:將當前數(shù)據(jù)塊寫入緩沖區(qū),保留索引,緩存數(shù)據(jù)塊,并重置當前的數(shù)據(jù)塊。[0121]步驟811:寫入當前數(shù)據(jù)塊的布隆過濾器信息。[0122]對于基于本發(fā)明文件格式所存儲的記錄的讀取方式,依次讀取HeaderLength、文件格式頭(header),Blockindex,BloomFiler等基本信息。圖9為根據(jù)本發(fā)明實施方式的讀取順序示意圖。[0123]對于Block的讀取,則是依據(jù)用戶的請求尋找(seek)到用戶key所在的位置后,加載key所在的Block塊,讀取用戶需要的信息。[0124]數(shù)據(jù)塊分為預(yù)取讀和延遲讀:預(yù)取讀是一次性的讀多個Block塊;延遲讀是聚集多次讀,然后一次性的讀多個Block塊。[0125]根據(jù)預(yù)取讀和聚集的多次讀信息,計算讀取的起始block塊和ReadBuffer的大小,計算所需要讀取的block數(shù)目以及讀取的長度,block塊的起始位置和長度在BlockIndex中獲取。[0126]首先獲取起始塊的開始地址,若當前Block塊是SSTable文件最后一塊,直接獲取最后一塊的長度并記錄后返回;若不是SSTable文件最后一塊,獲取下一Block塊的起始地址和長度。[0127]若是預(yù)取讀方式,則讀取長度小于ReadBuffer的長度,且當前Block塊不是最后一個Block塊,取下一Block塊的起始地址,并記錄下一塊的長度,直到讀取長度大于ReadBuffer長度為止結(jié)束。[0128]若是延遲讀方式,則聚集每次讀取的Block塊信息,然后獲取起始塊的開始地址和讀取方式與預(yù)取讀方式類似。[0129]預(yù)取讀與延遲讀本質(zhì)都是一次性的讀取多個Block塊,盡量減少讀取磁盤時的尋道和轉(zhuǎn)動,加速磁盤讀取。[0130]圖10為根據(jù)本發(fā)明實施方式的記錄(record)數(shù)據(jù)讀取流程示意圖。[0131]如圖10所示,該方法包括:[0132]步驟1001:獲取起始數(shù)據(jù)塊的起始地址。[0133]步驟1002:判斷當前數(shù)據(jù)塊是否是最后一塊,如果是則執(zhí)行步驟1003及其后續(xù)步驟,否則執(zhí)行步驟1004及其后續(xù)步驟。[0134]步驟1003:獲取最后一塊數(shù)據(jù)塊的長度并記錄,然后返回,并退出本流程。[0135]步驟1004:獲取下一數(shù)據(jù)塊的起始地址以及當前數(shù)據(jù)塊的長度。[0136]步驟1005:判斷是否執(zhí)行預(yù)取操作,如果不執(zhí)行,則退出本流程,如果執(zhí)行,則執(zhí)行步驟1006及其后續(xù)步驟。[0137]步驟1006:判斷讀取長度是否小于最大讀取大小(KMaxReadSize)并且不是最后一塊數(shù)據(jù)塊,如果是則執(zhí)行步驟1007及其后續(xù)步驟,否則執(zhí)行步驟1008及其后續(xù)步驟。[0138]步驟1007:取得再下一塊數(shù)據(jù)塊的起始地址,記錄下一數(shù)據(jù)塊的長度。[0139]步驟1008:判斷讀取長度是否大于等于最大讀取大小(KMaxReadSize),如果是則退出本流程,如果不是則執(zhí)行步驟1009。[0140]步驟1009:取得最后一塊數(shù)據(jù)塊長度并記錄。[0141]基于上述詳細分析,本發(fā)明實施方式還提出了一種鍵排序的數(shù)據(jù)存儲裝置。[0142]圖11為根據(jù)本發(fā)明實施方式的鍵排序的數(shù)據(jù)存儲裝置結(jié)構(gòu)圖。[0143]如圖11所示,該裝置包括定長鍵存儲單元1101和變長鍵存儲單元1102。[0144]其中:[0145]定長鍵存儲單元1101,用于在在第一數(shù)據(jù)塊中存儲定長鍵及其值,其中所述存儲定長鍵包括:統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分;[0146]變長鍵存儲單元1102,用于在第二數(shù)據(jù)塊存儲變長鍵及其值,其中所述存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。[0147]在一個實施方式中,該裝置進一步包括鍵類型區(qū)分單元1103。[0148]鍵類型區(qū)分單元1103,用于根據(jù)預(yù)先設(shè)置的閾值長度和閾值差分將變長鍵劃分為基準鍵類型和前綴壓縮鍵類型;其中:將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串小于所述閾值長度,則判定該當前變長鍵為基準鍵類型;將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串大于所述閾值長度與閾值差分的和,則判定該當前變長鍵為基準鍵類型;將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串大于所述閾值長度而小于所述閾值長度與閾值差分的和,則判定該當前變長鍵為前綴壓縮鍵類型。[0149]優(yōu)選地,定長鍵存儲單元1101,用于針對前綴壓縮鍵類型的變長鍵,存儲該前綴壓縮鍵類型的變長鍵與上一個基準鍵的公共前綴的長度,以及存儲該前綴壓縮鍵類型的變長鍵去除該公共前綴后的剩余部分。[0150]在一個實施方式中,進一步包括數(shù)據(jù)塊間壓縮單元1104,其中:[0151]數(shù)據(jù)塊間壓縮單元1104,用于當判定將定長鍵及其值存儲到第一數(shù)據(jù)塊失敗時,壓縮所述第一數(shù)據(jù)塊;當判定將變長鍵及其值存儲到第二數(shù)據(jù)塊失敗時,壓縮所述第二數(shù)據(jù)塊。[0152]優(yōu)選地,進一步包括存儲緩沖單元1105;[0153]存儲緩沖單元1105,用于分配存儲緩沖區(qū),并當壓縮后第一數(shù)據(jù)塊的大小小于所述存儲緩沖區(qū)時,將所述壓縮后第一數(shù)據(jù)塊寫入所述存儲緩沖區(qū);當壓縮后第二數(shù)據(jù)塊的大小小于所述存儲緩沖區(qū)時,將所述壓縮后第二數(shù)據(jù)塊寫入所述存儲緩沖區(qū)。[0154]優(yōu)選地,進一步包括布隆過濾器1106;其中:[0155]布隆過濾器1106,用于當判定將定長鍵及其值存儲到第一數(shù)據(jù)塊成功時,將所述定長鍵及其值的布隆過濾器信息寫入其中;當判定將變長鍵及其值存儲到第二數(shù)據(jù)塊成功時,將所述定長鍵及其值的布隆過濾器信息寫入其中。[0156]在一個實施方式中,進一步包括讀取緩沖單元1107;[0157]讀取緩沖單元1107,用于設(shè)置讀取緩沖區(qū),并當判定該讀取操作的讀取長度小于所述緩沖區(qū)且該當前數(shù)據(jù)塊不是最后數(shù)據(jù)塊時,取出下一數(shù)據(jù)塊的起始地址并記錄下一數(shù)據(jù)塊的長度并繼續(xù)讀取,直到讀取長度大于所述緩沖區(qū)的長度為止。[0158]在一個實施方式中,進一步包括數(shù)據(jù)塊索引存儲單元1108;[0159]數(shù)據(jù)塊索引存儲單元1108,用于存儲第一數(shù)據(jù)塊和第二數(shù)據(jù)塊的最后一條單元(cell)的全量鍵,并存儲第一數(shù)據(jù)塊和第二數(shù)據(jù)塊在數(shù)據(jù)存儲文件中的偏移量以及當前行鍵的長度。[0160]可以將圖11所示裝置集成到各種通信網(wǎng)絡(luò)的硬件實體當中。[0161]實際上,可以通過多種形式來具體實施本發(fā)明實施方式所提出的基于鍵排序的數(shù)據(jù)存儲裝置。比如,可以遵循一定規(guī)范的應(yīng)用程序接口,將基于鍵排序的數(shù)據(jù)存儲裝置編寫為存儲服務(wù)器中的插件程序,也可以將其封裝為應(yīng)用程序以供用戶自行下載使用。當編寫為插件程序時,可以將其實施為OCX、dll、cab等多種插件形式。也可以通過Flash插件、RealPlayer插件、MMS插件、MIDI五線譜插件、ActiveX插件等具體技術(shù)來實施本發(fā)明實施方式所提出的基于鍵排序的數(shù)據(jù)存儲裝置。[0162]可以通過指令或指令集存儲的儲存方式將本發(fā)明實施方式所提出的基于鍵排序的數(shù)據(jù)存儲方法存儲在各種存儲介質(zhì)上。這些存儲介質(zhì)包括但是不局限于:軟盤、光盤、DVD、硬盤、閃存、U盤、CF卡、SD卡、MMC卡、SM卡、記憶棒(MemoryStick)、xD卡等。[0163]另外,還可以將本發(fā)明實施方式所提出的基于鍵排序的數(shù)據(jù)存儲方法應(yīng)用到基于閃存(Nandflash)的存儲介質(zhì)中,比如U盤、CF卡、SD卡、SDHC卡、MMC卡、SM卡、記憶棒、xD卡等。[0164]綜上所述,在本發(fā)明實施方式中,在第一數(shù)據(jù)塊中存儲定長鍵及其值,其中所述存儲定長鍵包括:統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分;在第二數(shù)據(jù)塊存儲變長鍵及其值,其中所述存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。由此可見,應(yīng)用本發(fā)明實施方式之后,變長鍵數(shù)據(jù)塊內(nèi)采用前綴壓縮方式,以及優(yōu)選對每個數(shù)據(jù)塊進行壓縮,因此可以有效減小數(shù)據(jù)的存儲空間,提聞機器磁盤利用率。[0165]另外,不同于現(xiàn)有技術(shù)中以單個Key為存儲單位,本發(fā)明實施方式以數(shù)據(jù)塊為存儲單元,因此可以有利于IO和解析的力度。[0166]而且,本發(fā)明實施方式在讀取數(shù)據(jù)時,可以依據(jù)索引塊以及數(shù)據(jù)塊內(nèi)部的有序性,快速定位查詢的數(shù)據(jù),從而提高查詢效率。[0167]以上所述,僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。【權(quán)利要求】1.一種基于鍵排序的數(shù)據(jù)存儲方法,其特征在于,該方法包括:在第一數(shù)據(jù)塊中存儲定長鍵及其值,其中所述存儲定長鍵包括:統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分;在第二數(shù)據(jù)塊存儲變長鍵及其值,其中所述存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。2.根據(jù)權(quán)利要求1所述的基于鍵排序的數(shù)據(jù)存儲方法,其特征在于,該方法進一步包括:根據(jù)預(yù)先設(shè)置的閾值長度和閾值差分將變長鍵劃分為基準鍵類型和前綴壓縮鍵類型,其中:將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串小于所述閾值長度,則判定該當前變長鍵為基準鍵類型;將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串大于所述閾值長度與閾值差分的和,則判定該當前變長鍵為基準鍵類型;將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串大于所述閾值長度而小于所述閾值長度與閾值差分的和,則判定該當前變長鍵為前綴壓縮鍵類型。3.根據(jù)權(quán)利要求2所述的基于鍵排序的數(shù)據(jù)存儲方法,其特征在于,所述對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮包括:針對前綴壓縮鍵類型的變長鍵,存儲該前綴壓縮鍵類型的變長鍵與上一個基準鍵的公共前綴的長度,以及存儲該前綴壓縮鍵類型的變長鍵去除該公共前綴后的剩余部分。4.根據(jù)權(quán)利要求1所述的基于鍵排序的數(shù)據(jù)存儲方法,其特征在于,該方法進一步包括:當判定將定長鍵及其值存儲到第一數(shù)據(jù)塊失敗時,壓縮所述第一數(shù)據(jù)塊,并分配存儲緩沖區(qū);當壓縮后第一數(shù)據(jù)塊的大小小于所述存儲緩沖區(qū)時,將所述壓縮后第一數(shù)據(jù)塊寫入所述存儲緩沖區(qū);當判定將變長鍵及其值存儲到第二數(shù)據(jù)塊失敗時,壓縮所述第二數(shù)據(jù)塊,并分配存儲緩沖區(qū);當壓縮后第二數(shù)據(jù)塊的大小小于所述存儲緩沖區(qū)時,將所述壓縮后第二數(shù)據(jù)塊寫入所述存儲緩沖區(qū)。5.根據(jù)權(quán)利要求1所述的基于鍵排序的數(shù)據(jù)存儲方法,其特征在于,該方法進一步包括:當判定將定長鍵及其值存儲到第一數(shù)據(jù)塊成功時,將所述定長鍵及其值的布隆過濾器信息寫入到布隆過濾器中;當判定將變長鍵及其值存儲到第二數(shù)據(jù)塊成功時,將所述定長鍵及其值的布隆過濾器信息寫入到布隆過濾器中。6.根據(jù)權(quán)利要求1所述的基于鍵排序的數(shù)據(jù)存儲方法,其特征在于,該方法進一步包括:設(shè)置讀取緩沖區(qū),并當判定該讀取操作的讀取長度小于所述緩沖區(qū)且該當前數(shù)據(jù)塊不是最后數(shù)據(jù)塊時,取出下一數(shù)據(jù)塊的起始地址并記錄下一數(shù)據(jù)塊的長度并繼續(xù)讀取,直到讀取長度大于所述緩沖區(qū)的長度為止。7.一種基于鍵排序的數(shù)據(jù)存儲裝置,其特征在于,該裝置包括定長鍵存儲單元和變長鍵存儲單元,其中:定長鍵存儲單元,用于在在第一數(shù)據(jù)塊中存儲定長鍵及其值,其中所述存儲定長鍵包括:統(tǒng)一存儲各個定長鍵的公共前綴,并分別存儲各個定長鍵去除公共前綴后的剩余部分;變長鍵存儲單元,用于在第二數(shù)據(jù)塊存儲變長鍵及其值,其中所述存儲變長鍵包括:全量存儲基準鍵類型的變長鍵,而對前綴壓縮鍵類型的變長鍵執(zhí)行前綴壓縮。8.根據(jù)權(quán)利要求7所述的基于鍵排序的數(shù)據(jù)存儲裝置,其特征在于,該裝置進一步包括鍵類型區(qū)分單元;鍵類型區(qū)分單元,用于根據(jù)預(yù)先設(shè)置的閾值長度和閾值差分將變長鍵劃分為基準鍵類型和前綴壓縮鍵類型;其中:將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串小于所述閾值長度,則判定該當前變長鍵為基準鍵類型;將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串大于所述閾值長度與閾值差分的和,則判定該當前變長鍵為基準鍵類型;將當前變長鍵與上一個基準鍵進行前綴比較,如果相同前綴串大于所述閾值長度而小于所述閾值長度與閾值差分的和,則判定該當前變長鍵為前綴壓縮鍵類型。9.根據(jù)權(quán)利要求7所述的基于鍵排序的數(shù)據(jù)存儲裝置,其特征在于,定長鍵存儲單元,用于針對前綴壓縮鍵類型的變長鍵,存儲該前綴壓縮鍵類型的變長鍵與上一個基準鍵的公共前綴的長度,以及存儲該前綴壓縮鍵類型的變長鍵去除該公共前綴后的剩余部分。10.根據(jù)權(quán)利要求7所述的基于鍵排序的數(shù)據(jù)存儲裝置,其特征在于,進一步包括數(shù)據(jù)塊間壓縮單元,其中:數(shù)據(jù)塊間壓縮單元,用于當判定將定長鍵及其值存儲到第一數(shù)據(jù)塊失敗時,壓縮所述第一數(shù)據(jù)塊;當判定將變長鍵及其值存儲到第二數(shù)據(jù)塊失敗時,壓縮所述第二數(shù)據(jù)塊。11.根據(jù)權(quán)利要求10所述的基于鍵`排序的數(shù)據(jù)存儲裝置,其特征在于,進一步包括存儲緩沖單元;存儲緩沖單元,用于分配存儲緩沖區(qū),并當壓縮后第一數(shù)據(jù)塊的大小小于所述存儲緩沖區(qū)時,將所述壓縮后第一數(shù)據(jù)塊寫入所述存儲緩沖區(qū);當壓縮后第二數(shù)據(jù)塊的大小小于所述存儲緩沖區(qū)時,將所述壓縮后第二數(shù)據(jù)塊寫入所述存儲緩沖區(qū)。12.根據(jù)權(quán)利要求7所述的基于鍵排序的數(shù)據(jù)存儲裝置,其特征在于,進一步包括布隆過濾器;其中:布隆過濾器,用于當判定將定長鍵及其值存儲到第一數(shù)據(jù)塊成功時,將所述定長鍵及其值的布隆過濾器信息寫入其中;當判定將變長鍵及其值存儲到第二數(shù)據(jù)塊成功時,將所述定長鍵及其值的布隆過濾器信息寫入其中。13.根據(jù)權(quán)利要求7所述的基于鍵排序的數(shù)據(jù)存儲裝置,其特征在于,進一步包括讀取緩沖單元;讀取緩沖單元,用于設(shè)置讀取緩沖區(qū),并當判定該讀取操作的讀取長度小于所述緩沖區(qū)且該當前數(shù)據(jù)塊不是最后數(shù)據(jù)塊時,取出下一數(shù)據(jù)塊的起始地址并記錄下一數(shù)據(jù)塊的長度并繼續(xù)讀取,直到讀取長度大于所述緩沖區(qū)的長度為止。14.根據(jù)權(quán)利要求7所述的基于鍵排序的數(shù)據(jù)存儲裝置,其特征在于,進一步包括數(shù)據(jù)塊索引存儲單元;數(shù)據(jù)塊索引存儲單元,用于存儲第一數(shù)據(jù)塊和第二數(shù)據(jù)塊的最后一條單元(cell)的全量鍵,并存儲第一數(shù)據(jù)塊和第二數(shù)`據(jù)塊在數(shù)據(jù)存儲文件中的偏移量以及當前行鍵的長度?!疚臋n編號】G06F17/30GK103870492SQ201210541207【公開日】2014年6月18日申請日期:2012年12月14日優(yōu)先權(quán)日:2012年12月14日【發(fā)明者】陳崢,鄧大付申請人:騰訊科技(深圳)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1