一種基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法
【專利摘要】本發(fā)明公開(kāi)了一種基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法,實(shí)施步驟如下:預(yù)先構(gòu)建層次化鍵碼命名規(guī)則并確定鍵碼間的比較方法;執(zhí)行數(shù)據(jù)存儲(chǔ)請(qǐng)求時(shí),根據(jù)鍵碼比較方法來(lái)確定數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼排序位置并將數(shù)據(jù)插入鍵值數(shù)據(jù)庫(kù);執(zhí)行數(shù)據(jù)查詢請(qǐng)求時(shí),查找第一個(gè)大于或等于目標(biāo)鍵碼目錄下所有可能鍵碼的下確界作為起始鍵碼,從起始鍵碼開(kāi)始,將所有以目標(biāo)鍵碼開(kāi)頭的鍵值對(duì)以及子目錄作為數(shù)據(jù)查詢請(qǐng)求的結(jié)果返回。本發(fā)明能夠在鍵值數(shù)據(jù)庫(kù)的傳統(tǒng)特性的基礎(chǔ)上具備高速層次化數(shù)據(jù)的存儲(chǔ)和查詢能力,能夠有效地組織和存儲(chǔ)類似樹狀的復(fù)雜數(shù)據(jù),可作為輕型分布式網(wǎng)絡(luò)文件系統(tǒng)支持海量文件的目錄方式數(shù)據(jù)存儲(chǔ)。
【專利說(shuō)明】-種基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及鍵值數(shù)據(jù)庫(kù)(Key-Value數(shù)據(jù)庫(kù))【技術(shù)領(lǐng)域】,具體涉及一種基于鍵值數(shù) 據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法。
【背景技術(shù)】
[0002] 對(duì)比典型SQL數(shù)據(jù)庫(kù),鍵值數(shù)據(jù)庫(kù)(Key-Value數(shù)據(jù)庫(kù))用于存儲(chǔ)無(wú)結(jié)構(gòu)的鍵值數(shù) 據(jù),即以鍵碼(即Key)作為索引,對(duì)Key對(duì)應(yīng)的數(shù)據(jù)記錄(即Value)進(jìn)行讀、寫、刪除等操 作。由于鍵值數(shù)據(jù)庫(kù)只關(guān)心通過(guò)Key索引Value的過(guò)程,不關(guān)心Value中存儲(chǔ)的具體數(shù)據(jù) 的結(jié)構(gòu)和內(nèi)容,因此鍵值數(shù)據(jù)庫(kù)相較于SQL數(shù)據(jù)庫(kù)而言,具有功能專一、平面化存取數(shù)據(jù)性 能高、分布式處理的可擴(kuò)展性強(qiáng)的優(yōu)點(diǎn)。
[0003] 目前,鍵值數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)本身的結(jié)構(gòu)表達(dá)能力較弱,整個(gè)數(shù)據(jù)庫(kù)可以被簡(jiǎn)單地看 成一張扁平的一維數(shù)組形式的大表,使用key作為數(shù)組的索引,value是數(shù)組中對(duì)應(yīng)元素的 數(shù)據(jù)。這種扁平化的一對(duì)一存儲(chǔ)查詢模式存在以下不足。
[0004] 一、現(xiàn)實(shí)生活中的數(shù)據(jù)往往是具有一定屬性層次的。以圖1所示的班級(jí)學(xué)生的考 試成績(jī)?yōu)槔?班包括小王和小李等學(xué)生節(jié)點(diǎn),每一位學(xué)生又分別包括語(yǔ)文、數(shù)學(xué)等科目節(jié) 點(diǎn),每一個(gè)科目節(jié)點(diǎn)對(duì)應(yīng)一個(gè)考試成績(jī)的數(shù)值,例如小王的語(yǔ)文成績(jī)?yōu)?1分。如果想按照 圖1所示的數(shù)據(jù)組織,分層分類存儲(chǔ)各個(gè)同學(xué)的分?jǐn)?shù)數(shù)據(jù),則鍵值數(shù)據(jù)庫(kù)現(xiàn)有的扁平化的 一對(duì)一〈key, value〉存儲(chǔ)模式很難滿足該存儲(chǔ)需求。
[0005] 二、現(xiàn)有的鍵值數(shù)據(jù)庫(kù)很難對(duì)某同一層次的數(shù)據(jù)進(jìn)行查詢并迭代。參見(jiàn)圖1,若鍵 值數(shù)據(jù)庫(kù)存儲(chǔ)各個(gè)人的考試成績(jī)的話,通常的key-value對(duì)描述可能是:〈"1班的小王的 語(yǔ)文成績(jī)",91>,若我們想從中查詢1班都有哪幾位學(xué)生時(shí),盡管上述鍵值數(shù)據(jù)庫(kù)中key的 信息包含了該問(wèn)題的答案,但現(xiàn)有的鍵值數(shù)據(jù)庫(kù)將很難做出查詢。這是因?yàn)楝F(xiàn)有的鍵值數(shù) 據(jù)庫(kù)不存在層次化的存儲(chǔ)結(jié)構(gòu),所以只能夠通過(guò)迭代整個(gè)數(shù)據(jù)庫(kù)中所有的Key的方式來(lái)逐 一查詢并提取信息,整體效率相對(duì)較低,耗時(shí)長(zhǎng)。
【發(fā)明內(nèi)容】
[0006] 本發(fā)明要解決的技術(shù)問(wèn)題是:針對(duì)現(xiàn)有技術(shù)的上述技術(shù)問(wèn)題,提供一種能夠在鍵 值數(shù)據(jù)庫(kù)的傳統(tǒng)特性的基礎(chǔ)上具備高速層次化數(shù)據(jù)的存儲(chǔ)和查詢能力,能夠有效地組織和 存儲(chǔ)類似樹狀的復(fù)雜數(shù)據(jù),可作為輕型分布式網(wǎng)絡(luò)文件系統(tǒng)支持海量文件的目錄方式數(shù)據(jù) 存儲(chǔ)的基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法。
[0007] 為了解決上述技術(shù)問(wèn)題,本發(fā)明采用的技術(shù)方案為:
[0008] 一種基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法,其實(shí)施步驟如下:
[0009] 1)預(yù)先在有序存儲(chǔ)的鍵值數(shù)據(jù)庫(kù)中構(gòu)建層次化鍵碼命名規(guī)則,所述層次化鍵碼命 名規(guī)則將鍵碼定義為以分隔符開(kāi)頭、且由分隔符和子串交替組合組成,分隔符的數(shù)量表示 鍵碼的級(jí)數(shù);確定兩個(gè)合法的鍵碼之間的大小比較方法,級(jí)數(shù)越大則鍵碼越大,級(jí)數(shù)相同的 鍵碼則根據(jù)字符串比較確定大??;
[0010] 2)接收鍵值數(shù)據(jù)庫(kù)的訪問(wèn)請(qǐng)求,如果訪問(wèn)請(qǐng)求為數(shù)據(jù)存儲(chǔ)請(qǐng)求,則跳轉(zhuǎn)執(zhí)行步驟 3),如果訪問(wèn)請(qǐng)求為數(shù)據(jù)查詢請(qǐng)求,則跳轉(zhuǎn)執(zhí)行步驟4);
[0011] 3)根據(jù)所述兩個(gè)合法的鍵碼之間的大小比較方法來(lái)確定數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼排 序位置,然后按照排序位置將數(shù)據(jù)存儲(chǔ)請(qǐng)求的數(shù)據(jù)插入鍵值數(shù)據(jù)庫(kù),返回執(zhí)行步驟2);
[0012] 4)在鍵值數(shù)據(jù)庫(kù)中按照從小到大的順序查找第一個(gè)大于或等于數(shù)據(jù)查詢請(qǐng)求的 目標(biāo)鍵碼k ey<to目錄下所有可能鍵碼的下確界作為起始鍵碼keystart,從起始鍵碼keystart開(kāi) 始,按照從小到大的順序?qū)⑺幸阅繕?biāo)鍵碼key-開(kāi)頭的鍵值對(duì)以及子目錄作為數(shù)據(jù)查詢 請(qǐng)求的結(jié)果返回。
[0013] 優(yōu)選地,所述步驟1)中確定的兩個(gè)合法的鍵碼之間的大小比較方法如下:
[0014] 1. 1)接收由key 1和key2組成的兩個(gè)合法的鍵碼;
[0015] 1. 2)比較key 1和key2之間的級(jí)數(shù)大小,如果key 1和key2的級(jí)數(shù)不同,則跳轉(zhuǎn)執(zhí) 行步驟1. 3),否則跳轉(zhuǎn)執(zhí)行步驟1. 4);
[0016] 1. 3)判斷key 1的級(jí)數(shù)大于key2的級(jí)數(shù)是否成立,如果成立則判定key 1比key2 大,否則判定key2比key 1大,返回比較結(jié)果并退出;
[0017] 1.4)初始化 i 為 1;
[0018] 1. 5)判斷keyl的級(jí)數(shù)大于或等于i是否成立,如果成立則跳轉(zhuǎn)執(zhí)行步驟1. 6);否 則判定keyl等于key2,返回比較結(jié)果并退出;
[0019] 1. 6)判斷keyl和key2的前i級(jí)子串是否相等,如果相等則將i增加1,跳轉(zhuǎn)執(zhí)行 步驟1. 5);否則,判斷keyl的第i級(jí)子串大于key2的第i級(jí)子串是否成立,如果成立則判 定keyl比key2大,否則判定key2比key 1大,返回比較結(jié)果并退出。
[0020] 優(yōu)選地,所述步驟3)的詳細(xì)步驟如下:
[0021] 3. 1)接收用戶的數(shù)據(jù)存儲(chǔ)請(qǐng)求〈newKey, newValue〉,其中newKey表不數(shù)據(jù)存儲(chǔ)請(qǐng) 求的鍵碼,newValue表示數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵值;
[0022] 3. 2)判定所述鍵值數(shù)據(jù)庫(kù)是否為空,如果鍵值數(shù)據(jù)庫(kù)為空,則直接將所述數(shù)據(jù)存 儲(chǔ)請(qǐng)求的鍵值對(duì)〈newKey,newValue〉存入鍵值數(shù)據(jù)庫(kù)并退出;如果鍵值數(shù)據(jù)庫(kù)非空,則跳 轉(zhuǎn)執(zhí)行下一步; _
[0023] 3. 3)順序查找第一個(gè)大于或等于所述數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey的目標(biāo)鍵碼 existed_key ;
[0024] 3. 4)判斷所述數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey是否等于目標(biāo)鍵碼existed_key,如果 所述數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey等于目標(biāo)鍵碼existed_key,則判定所述數(shù)據(jù)存儲(chǔ)請(qǐng)求的 鍵碼newKey在鍵值數(shù)據(jù)庫(kù)中是否己經(jīng)存在,將目標(biāo)鍵碼existed_key對(duì)應(yīng)的鍵值替換為數(shù) 據(jù)存儲(chǔ)請(qǐng)求的鍵值對(duì)〈newKey, newValue〉中的新鍵值newValue并退出;否則,將所述數(shù)據(jù) 存儲(chǔ)請(qǐng)求的鍵值對(duì)〈newKey, newValue〉插入保存在目標(biāo)鍵碼existed_key對(duì)應(yīng)的鍵值對(duì) 、貧- 刖。
[0025] 優(yōu)選地,所述步驟4)的詳細(xì)步驟如下:
[0026] 4_ 1)初始化查詢結(jié)果集合SMt ;在鍵值數(shù)據(jù)庫(kù)中按照從小到大的順序查找第一個(gè) 大于或等于數(shù)據(jù)查詢請(qǐng)求的目標(biāo)鍵碼key&目錄下所有可能鍵碼的下確界作為起始鍵碼 keystart,將起始鍵碼keystart作為當(dāng)前指針鍵碼keynMt ;所述數(shù)據(jù)查詢請(qǐng)求的目標(biāo)鍵碼ke?r 滿足式(1)所示字符串形式,所述目標(biāo)鍵碼keyto目錄下所有可能鍵碼的下確界符合式(2) 所示字符串形式;
[0027] fmkke)^ / mbkey^ /./ Slibkey{t, Cl)
[0028]式⑴中,.vw/如·>?,表示目標(biāo)鍵碼keydir的第i級(jí)子串,i表示目標(biāo)鍵碼 keyd的 級(jí)數(shù),/表示分隔符; 11:
[0029] fsubkeylv/subkey2^ /..,/smbkeyll /α (2)
[0030]式(2)中,5表示目標(biāo)鍵碼keydir的第i-1級(jí)子串; α表示構(gòu)成鍵碼子串的 字符串全集中排序規(guī)則最小的字符串;/表示分隔符;
[0031] 4· 2)判斷當(dāng)前指針鍵碼keynra!t以式(1)所示字符串開(kāi)頭、匹配式所示字符串 形式的第i+Ι層目錄兩個(gè)條件是否同時(shí)成立,如果同時(shí)成立則將當(dāng)前指針鍵碼key對(duì)應(yīng) 的鍵值對(duì)<keyn ext, Value〉加入到查詢結(jié)果集合Sr(;t,后移查找指針得到新的當(dāng)前指針鍵碼 keynext,跳轉(zhuǎn)執(zhí)行步驟4.2);否則跳轉(zhuǎn)執(zhí)行步驟4.3);
[0032] 4subkeyly i siAke^ f f 端 (力
[0033]式⑶中,祕(mì)轉(zhuǎn)表示目標(biāo)鍵碼keydir的第i級(jí)子串,表示當(dāng)前指針 鍵碼keynext的弟i+Ι級(jí)子串,/表不分隔符;
[0034] 4. 3)判斷當(dāng)前指針鍵碼keynext以字符串式(1)開(kāi)頭、同時(shí)匹配式(4)所示字符串 形式的η層結(jié)構(gòu)兩個(gè)條件是否仍然成立,如果成立則判定當(dāng)前指針鍵碼匕%#位于目標(biāo)鍵 碼keydir下的某一級(jí)子目錄中,跳轉(zhuǎn)執(zhí)行步驟4. 4),否則跳轉(zhuǎn)執(zhí)行步驟4. 6)ne;Xt
[0035] Jsuhkey^ i·,./rnMey1^ isubkey^ /../subkey^ ¢4)
[0036] 式⑷中,如施土表示目標(biāo)鍵碼keydlr的第i級(jí)子串,踢,表示當(dāng)前指針 鍵碼keynMt的第i+Ι級(jí)子串,?t表示當(dāng)前指針鍵碼key_ t的第n級(jí)子串,z表示分 隔符;
[0037] 一 4.4)判定式(3)所示字符串形式的子目錄為目標(biāo)鍵碼keydir的下一級(jí)目錄,將式 (3)所示字符串作為鍵碼和子目錄標(biāo)識(shí)生成式(5)所示形式的鍵值對(duì)并加入到查詢結(jié)果集 合 Sret ;
[0038] i/mbk^efJsM^y i^Jsmbkey^ ,[dir]> (5?
[0039] 式(5)所示形式的鍵值對(duì)中,鍵碼為式(3)所示的字符串,鍵值[dir]表示子目錄 標(biāo)識(shí),/表不分隔符;
[0040] 4· 5)跳過(guò)當(dāng)前指針鍵碼keyMxt對(duì)應(yīng)目錄下的所有鍵碼,從當(dāng)前指針鍵碼keyMxt開(kāi) 始,按照從小到大的順序查找第一個(gè)大于式(6)所示字符串形式的鍵碼作為新的當(dāng)前指針 鍵碼keynext,判斷新的當(dāng)前指針鍵碼keynext以式(1)所示字符串開(kāi)頭是否成立,如果成立則 跳轉(zhuǎn)執(zhí)行步驟4. 3),否則跳轉(zhuǎn)執(zhí)行步驟4. 6); _] (6) _2]式⑹中,*表示目標(biāo)鍵碼keydir的第i級(jí)子串,表示當(dāng)前指針鍵 碼keynMt的第i+1級(jí)子串,α表示構(gòu)成鍵碼子串的字符串全集中排序規(guī)則最小的字符串, /表示分隔符;表示對(duì)于當(dāng)前指針鍵碼keynext中使用Next方法返回一個(gè)字 符串subkeynext,所述Next方法具體是指針對(duì)當(dāng)前指針鍵碼keynMt下所有子串可能構(gòu)成的 字符串全集中的任意字符串s,如果該字符串s大于或等于目標(biāo)鍵碼keydir的第i級(jí)子串 ,則將大于目標(biāo)鍵碼keydir的第i級(jí)子串抑驗(yàn)^且小于或等于該字符串s之間 的子串subkeynexJt為結(jié)果返回;
[0043] 4_ 6)判斷當(dāng)前指針鍵碼keynext大于如式⑵所示字符串形式的鍵碼是否成立,如 果成立,則代表當(dāng)前指針鍵碼keynext所代表的如式(8)所示字符串形式的第n層鍵碼中已 無(wú)以式(1)所示字符串開(kāi)頭的鍵值對(duì)數(shù)據(jù),從當(dāng)前指針鍵碼keynfSt開(kāi)始,按照從小到大的 順序查找第一個(gè)大于如式( 9)所示字符串形式的鍵碼作為當(dāng)前指針鍵碼keynfStjn果不成 立,則按照從小到大的順序查找第一個(gè)等于或大于如式(7)所示字符串形式的鍵碼作為當(dāng) 前指針鍵碼key next ;
[0044] /subkeyltiy /subkey^J..J
[0045] 式(7)中,表示目標(biāo)鍵碼keydir的第i級(jí)子串;α i+1表示第i+l級(jí)字符串 為構(gòu)成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串,α n表示第n級(jí)字符串為構(gòu) 成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串;/表示分隔符;
[0046] hubkey]iey subkey2^ L,J suhke^j (g)
[0047] 式⑶中,表示目標(biāo)鍵碼keydir的第n級(jí)子串,/表示分隔符;
[0048] /subkeyly / subkey2^, /./ subkey'key / α? / / / (9)
[0049] 式(9)中,_%4^表示目標(biāo)鍵碼keydir的第i級(jí)子串;a i+1表示第i+1級(jí)字符串 為構(gòu)成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串,a n表示第η級(jí)字符串為構(gòu) 成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串;a 11+1表示第η+1級(jí)字符串為構(gòu) 成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串;/表示分隔符;
[0050] 4. 7)檢測(cè)當(dāng)前指針Key鍵碼否已經(jīng)到達(dá)鍵值數(shù)據(jù)庫(kù)的文件尾部,如果尚 未到達(dá)文件尾部則跳轉(zhuǎn)執(zhí)行步驟4· 3);否則跳轉(zhuǎn)執(zhí)行步驟4· 8);
[0051] 4. 8)將查詢結(jié)果集合SMt的內(nèi)容作為數(shù)據(jù)查詢請(qǐng)求的結(jié)果返回。
[0052] 優(yōu)選地,所述步驟4· 1)和4. 5)中按照從小到大的順序查找具體是指從小到大的 順序進(jìn)行逐一順序查找、二分查找或者SkipList查找。
[0053] 本發(fā)明基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法具有下述優(yōu)點(diǎn):本發(fā)明通過(guò)預(yù)先 在有序存儲(chǔ)的鍵值數(shù)據(jù)庫(kù)中構(gòu)建層次化鍵碼命名規(guī)則以及確定兩個(gè)合法的鍵碼之間的大 小比較方法,針對(duì)數(shù)據(jù)存儲(chǔ)請(qǐng)求,根據(jù)兩個(gè)合法的鍵碼之間的大小比較方法來(lái)確定數(shù)據(jù)存 儲(chǔ)請(qǐng)求的鍵碼排序位置,然后按照排序位置將數(shù)據(jù)存儲(chǔ)請(qǐng)求的數(shù)據(jù)插入鍵值數(shù)據(jù)庫(kù);針對(duì) 數(shù)據(jù)查詢請(qǐng)求,在鍵值數(shù)據(jù)庫(kù)中按照從小到大的順序查找第一個(gè)大于或等于數(shù)據(jù)查詢請(qǐng)求 的目i鍵碼目錄下所有可能鍵碼的下確界作為起始鍵碼,從起始鍵碼開(kāi)始,按照從小到大 的順序?qū)⑺幸阅繕?biāo)鍵碼開(kāi)頭的鍵值對(duì)以及子目錄作為數(shù)據(jù)查詢請(qǐng)求的結(jié)果返回,因此使 得一個(gè)已存在的有序存儲(chǔ)鍵值數(shù)據(jù)庫(kù)(比如:LevelDB等),在不改變已有的簡(jiǎn)單有效的 Key-Value平面化一對(duì)一存儲(chǔ)的前提下,同時(shí)具備層次化數(shù)據(jù)的存儲(chǔ)能力與查詢能力,使得 鍵值數(shù)據(jù)庫(kù)不但具有功能專一、平面化存取數(shù)據(jù)性能高、分布式處理的可擴(kuò)展性強(qiáng)等傳統(tǒng) 特性,也同時(shí)具備了高速層次化數(shù)據(jù)的存儲(chǔ)能力與查詢能力,從而可以有效組織存儲(chǔ)類似 樹狀的復(fù)雜數(shù)據(jù),還可以作為輕型分布式網(wǎng)絡(luò)文件系統(tǒng),支持海量文件的目錄方式的數(shù)據(jù) 存儲(chǔ)。
【專利附圖】
【附圖說(shuō)明】
[0054] 圖1為常見(jiàn)的具有屬性層次的學(xué)生考試成績(jī)數(shù)據(jù)結(jié)構(gòu)示意圖。
[0055] 圖2為本發(fā)明實(shí)施例的基本方法流程示意圖。
[0056] 圖3為本發(fā)明實(shí)施例中兩個(gè)合法的Key之間的大小比較方法的流程示意圖。
[0057] 圖4為本發(fā)明實(shí)施例中步驟3)執(zhí)行數(shù)據(jù)存儲(chǔ)請(qǐng)求的流程示意圖。
[0058] 圖5為本發(fā)明實(shí)施例中步驟4)執(zhí)行數(shù)據(jù)查詢請(qǐng)求的流程示意圖。
[0059] 圖6為本發(fā)明實(shí)施例中鍵值數(shù)據(jù)庫(kù)已存儲(chǔ)數(shù)據(jù)的層次結(jié)構(gòu)示意圖。
[0060] 圖7為本發(fā)明實(shí)施例中鍵值數(shù)據(jù)庫(kù)已存儲(chǔ)數(shù)據(jù)的初始數(shù)據(jù)實(shí)例示意圖。
[0061] 圖8為本發(fā)明實(shí)施例中鍵值數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)存儲(chǔ)請(qǐng)求的過(guò)程示意圖。
[0062] 圖9為本發(fā)明實(shí)施例中鍵值數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)存儲(chǔ)請(qǐng)求后的數(shù)據(jù)實(shí)例示意圖。
[0063] 圖10為本發(fā)明實(shí)施例中執(zhí)行數(shù)據(jù)查詢請(qǐng)求時(shí)針對(duì)keynext = /a/b的查詢過(guò)程示意 圖。
[0064] 圖11為本發(fā)明實(shí)施例中執(zhí)行數(shù)據(jù)查詢請(qǐng)求時(shí)針對(duì)keynfSt二/a/e的查詢過(guò)程示意 圖。
[0065] 圖12為本發(fā)明實(shí)施例中執(zhí)行數(shù)據(jù)查詢請(qǐng)求時(shí)針對(duì)keynra£t = /b/c的查詢過(guò)程示意 圖。
[0066] 圖13為本發(fā)明實(shí)施例中執(zhí)行數(shù)據(jù)查詢請(qǐng)求時(shí)針對(duì)keyMXt = /a/c/f/g的查詢過(guò)程 示意圖。
[0067] 圖14為本發(fā)明實(shí)施例中執(zhí)行數(shù)據(jù)查詢請(qǐng)求時(shí)針對(duì)keyn6Xt二/b/d/e/f的查詢過(guò)程 示意圖。
【具體實(shí)施方式】
[0068] 如圖2所示,本實(shí)施例基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法的實(shí)施步驟如 下:
[0069] 1)預(yù)先在有序存儲(chǔ)的鍵值數(shù)據(jù)庫(kù)中構(gòu)建層次化鍵碼命名規(guī)則,層次化鍵碼命名規(guī) 則將鍵碼定義為以分隔符開(kāi)頭、且由分隔符和子串交替組合組成,分隔符的數(shù)量表示鍵碼 的級(jí)數(shù);確定兩個(gè)合法的鍵碼之間的大小比較方法,級(jí)數(shù)越大則鍵碼越大,級(jí)數(shù)相同的鍵碼 則根據(jù)字符串比較確定大?。?br>
[0070] 2)接收鍵值數(shù)據(jù)庫(kù)的訪問(wèn)請(qǐng)求,如果訪問(wèn)請(qǐng)求為數(shù)據(jù)存儲(chǔ)請(qǐng)求,則跳轉(zhuǎn)執(zhí)行步驟 3),如果訪問(wèn)請(qǐng)求為數(shù)據(jù)查詢請(qǐng)求,則跳轉(zhuǎn)執(zhí)行步驟4);
[0071] 3)根據(jù)兩個(gè)合法的鍵碼之間的大小比較方法來(lái)確定數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼排序位 置,然后按照排序位置將數(shù)據(jù)存儲(chǔ)請(qǐng)求的數(shù)據(jù)插入鍵值數(shù)據(jù)庫(kù),返回執(zhí)行步驟2);
[0072] 4)在鍵值數(shù)據(jù)庫(kù)中按照從小到大的順序查找第一個(gè)大于或等于數(shù)據(jù)查詢請(qǐng)求的 目標(biāo)鍵碼keydir目錄下所有可能鍵碼的下確界作為起始鍵碼keystart,從起始鍵碼key start開(kāi) 始,按照從小到大的順序?qū)⑺幸阅繕?biāo)鍵碼keydir開(kāi)頭的鍵值對(duì)以及子目錄作為數(shù)據(jù)查詢 請(qǐng)求的結(jié)果返回。
[0073] 本實(shí)施例中層次化鍵碼命名規(guī)則如下:鍵碼定義為以分隔符開(kāi)頭、且由分隔符和 子串交替組合組成,其形式類似…//,分隔符的數(shù)量表示鍵 碼的級(jí)數(shù);確定兩個(gè)合法的鍵碼之間的大小比較方法,級(jí)數(shù)越大則鍵碼越大,級(jí)數(shù)相同的鍵 碼則根據(jù)字符串比較確定大小。本實(shí)施例中分隔符使用" / "表示,鍵碼的子串是指除了最 小字符串外其他所有某類字符任意組合的字符串,層次化key是由規(guī)定的分隔符與key子 串相互交替組合在一起的字符串,必須以分隔符開(kāi)頭。鍵碼的級(jí)數(shù)為分隔符"/,,的數(shù)目,用 Level (key)表示。本實(shí)施例中,定義從鍵碼key字符串的起始位置開(kāi)始,第n個(gè)分隔符與 第η+1個(gè)分隔符中間所夾著的字符串稱為鍵碼key的第η級(jí)子串,表示為甜(為闡 述方便,下文中η從1開(kāi)始計(jì)算)。對(duì)于字符串形式為論匕./的 鍵碼而言,字符串稱為key的第i層目錄;而起完整的字 符串則稱為第η層的key。上圖所示的層次化數(shù)據(jù),層次化查詢數(shù)據(jù)庫(kù)中以/a目錄層次下 的所有key與子目錄,應(yīng)該得到如下key-value列表:</a/b2, 100>,</a/bl, [dir] >。其中 [dir]表示/a/bl是目錄。
[0074] 如圖3所示,步驟1)中確定的兩個(gè)合法的鍵碼之間的大小比較方法如下:
[0075] 1. 1)接收由keyl和key2組成的兩個(gè)合法的鍵碼;
[0076] 1.2)比較 keyl 和 key2 之間的級(jí)數(shù)大?。ㄅ袛?Level (keyl) == Level (key2)是 否成立),如果keyl和key2的級(jí)數(shù)不同,則跳轉(zhuǎn)執(zhí)行步驟1· 3),否則跳轉(zhuǎn)執(zhí)行步驟1. 4);
[0077] 1. 3)判斷 keyl 的級(jí)數(shù)大于 key2 的級(jí)數(shù)(Level (keyl) >LeVel (key2))是否成立, 如果成立則判定keyl比key2大(keyl>key2),否則判定key2比keyl大(keyl<key2),返 回比較結(jié)果并退出;
[0078] 1. 4)初始化 i 為 1 ;
[0079] 1. 5)判斷keyl的級(jí)數(shù)大于或等于i (i< = Level (keyl))是否成立,如果成立則跳 轉(zhuǎn)執(zhí)行步驟1.6);否則判定keyl等于key2,返回比較結(jié)果并退出;
[0080] 1· 6)判斷keyl和key2的前i級(jí)子串是否相等(乂,vl == .wMd.2:),如果相 等則將i增加1,跳轉(zhuǎn)執(zhí)行步驟1. 5);否則,判斷keyl的第i級(jí)子串大于key2的第i級(jí)子 串(^^乂(.1, 1>.?^^^2)是否成立,如果成立則判定1^1比1^2大〇^1>1^2),否則 判定key2比keyl大(keyl<key2),返回比較結(jié)果并退出。
[0081] 本實(shí)施例中,判斷keyl的第i級(jí)子串大于key2的第i級(jí)子串是否成立時(shí)采用常 規(guī)字符串大小比較方法:將等長(zhǎng)度不同的兩個(gè)key子串,從前至后順序地逐個(gè)比較每個(gè)字 符的ASCII編碼值,比較過(guò)程中,首次出現(xiàn)ASCII值大的那個(gè)字符串為較大字符串,另一個(gè) 為較小字符串;若兩個(gè)字符串的每個(gè)字符ASCII編碼值都完全相同,則兩字符串相等。 [0082]需要說(shuō)明的是,比較每個(gè)字符的ASCII編碼值的具體算法不受限制,但必須在字 符串集合上滿足全序關(guān)系(比如常見(jiàn)的按字母編碼逐個(gè)進(jìn)行比較的字符串比較方法)。
[0083] 如圖4所示,步驟3)的詳細(xì)步驟如下:
[0084] 3. 1)接收用戶的數(shù)據(jù)存儲(chǔ)請(qǐng)求〈newKey, newValue〉,其中newKey表示數(shù)據(jù)存儲(chǔ)請(qǐng) 求的鍵碼,newValue表示數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵值;
[0085] 3. 2)判定鍵值數(shù)據(jù)庫(kù)是否為空,如果鍵值數(shù)據(jù)庫(kù)為空,則直接將數(shù)據(jù)存儲(chǔ)請(qǐng)求的 鍵值對(duì)〈newKey, newValue〉存入鍵值數(shù)據(jù)庫(kù)并退出;如果鍵值數(shù)據(jù)庫(kù)非空,則跳轉(zhuǎn)執(zhí)行下 一步;
[0086] 3. 3)順序查找第一個(gè)大于或等于數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey的目標(biāo)鍵碼 existed-key ;
[0087] 3· 4)判斷數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey是否等于目標(biāo)鍵碼existed_key(existed_ key == newKey),如果數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey等于目標(biāo)鍵碼existed_key,則判定 數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey在鍵值數(shù)據(jù)庫(kù)中是否已經(jīng)存在,將目標(biāo)鍵碼existecLkey對(duì) 應(yīng)的鍵值替換為數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵值對(duì)〈newKey, newValue〉中的新鍵值newValue并退 出;否則,將數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵值對(duì)〈newKey,newValue〉插入保存在目標(biāo)鍵碼existed^ key對(duì)應(yīng)的鍵值對(duì)前。需要說(shuō)明的是,若目標(biāo)鍵碼existed_key不滿足existed_key == newKey,則一定能夠找到這樣一個(gè)目標(biāo)鍵碼existed_key,它滿足newKey〈existed_key,并 且在當(dāng)前數(shù)據(jù)庫(kù)中,任何小于目標(biāo)鍵碼existed_key的less_existed_key,都滿足less_ existed_key<newKey (即在數(shù)據(jù)庫(kù)已有鍵值對(duì)中,一定存在一個(gè)第一個(gè)比數(shù)據(jù)存儲(chǔ)請(qǐng)求的 鍵碼newKey大的目標(biāo)鍵碼existed_key),因此本實(shí)施例中只需要將〈newKey, newValue〉鍵 值對(duì)插入保存到目標(biāo)鍵碼existecLkey對(duì)應(yīng)的鍵值對(duì)前即可。
[0088] 如圖5所示,步驟4)的詳細(xì)步驟如下:
[0089] 4· 1)初始化查詢結(jié)果集合Sret ;在鍵值數(shù)據(jù)庫(kù)中按照從小到大的順序查找第一個(gè) 大于或等于數(shù)據(jù)查詢請(qǐng)求的目標(biāo)鍵碼keydir目錄下所有可能鍵碼的下確界 作為起始鍵碼keystart,將起始鍵碼keystart作為當(dāng)前指針鍵碼keynfSt ;數(shù)據(jù)查詢請(qǐng)求的目 標(biāo)鍵碼keydir滿足式(1)所示字符串形式,目標(biāo)鍵碼keyfc目錄下所有可能鍵碼的下確界 ?符合式⑵所示字符串形式;
[0090] tsubkey1^ / mibke^^ I ". . / stMey^, C:l)
[0091] 式⑴中,沖表示目標(biāo)鍵碼keydir的第i級(jí)子串,i表示目標(biāo)鍵碼key dir的 級(jí)數(shù),/表示分隔符;
[0092] fsubkeyl^ Imbkm^ 1.. Jmbkey^ / α :(2)
[0093] 式(2)中,表示目標(biāo)鍵碼keydir的第i-l級(jí)子串; α表示構(gòu)成鍵碼子串的 字符串全集中排序規(guī)則最小的字符串;/表示分隔符;本實(shí)施例中,構(gòu)成鍵碼子串的字符串 為小寫字母,因此構(gòu)成鍵碼子串的字符串全集中排序規(guī)則最小的字符串為a ;
[0094] 4. 2)判斷當(dāng)前指針鍵碼keynext以式⑴所示字符串開(kāi)頭、匹配式⑶所示字符串 形式的第i+Ι層目錄兩個(gè)條件是否同時(shí)成立,如果同時(shí)成立則將當(dāng)前指針鍵碼key next對(duì)應(yīng) 的鍵值對(duì)<keynext,Value〉加入到查詢結(jié)果集合S"t,后移查找指針得到新的當(dāng)前指針鍵碼 keynext,跳轉(zhuǎn)執(zhí)行步驟4· 2);否則跳轉(zhuǎn)執(zhí)行步驟4· 3);
[0095] isuhkcy)^ / s^keyly /,, Jmbk^ f subkey^ ^ (|)
[00%]式⑶中,爲(wèi)表示目標(biāo)鍵碼keydir的第i級(jí)子串,處!表示當(dāng)前指針 鍵碼keynMt的第i+Ι級(jí)子串,/表示分隔符;
[0097] 4· 3)判斷當(dāng)前指針鍵碼keynext以字符串式⑴開(kāi)頭、同時(shí)匹配式⑷所示字符串 形式的η層結(jié)構(gòu)兩個(gè)條件是否仍然成立,如果成立則判定當(dāng)前指針鍵碼key_t位于目標(biāo)鍵 碼keydir下的某一級(jí)子目錄中,跳轉(zhuǎn)執(zhí)行步驟4. 4),否則跳轉(zhuǎn)執(zhí)行步驟4. 6)7
[0098] !subkeylm t subkeyliy /,/ subkey'w f mbkey'^ /... isubkeynk {4)
[0099] 式⑷中,表示目標(biāo)鍵碼keydir的第i級(jí)子串,表示當(dāng)前指針 鍵碼keynrait的第i+l級(jí)子串表示當(dāng)前指針鍵碼key_ t的第η級(jí)子串,/表示分 隔符;
[0100] 4.4)判定式(3)所示字符串形式的子目錄為目標(biāo)鍵碼keydir的下一級(jí)目錄,將式 (3)所不字符串作為鍵碼和子目錄標(biāo)識(shí)生成式(5)所示形式的鍵值對(duì)并加入到查詢結(jié)果集 合 Sret ;
[0101] <:/ smbke^i smlAe^ L.J sMe^L· fmibke^\ ,[dir] (5)
[0102]式(5)所不形式的鍵值對(duì)中,鍵碼為式(3)所示的字符串,鍵值[dir]表示子目錄 標(biāo)識(shí),/表示分隔符;
[0103] 4· 5)跳過(guò)當(dāng)前指針鍵碼keynexji應(yīng)目錄下的所有鍵碼,從當(dāng)前指針鍵碼 始,按照從小到大的順序查找第一個(gè)大于式(6)所示字符串形式的鍵碼作為新的當(dāng)前指針 鍵碼key^t,判斷新的當(dāng)前指針鍵碼keyn(st以式 (1)所示字符串開(kāi)頭是否成立,如果成立則 跳轉(zhuǎn)執(zhí)行步驟4. 3),否則跳轉(zhuǎn)執(zhí)行步驟4. 6);
[0104] !subkeylv ; subke^ f.,J subkeyiy / subhey;^ 1,.. / NextL 1 f a (0)
[0105]式(6)中,麵表示目標(biāo)鍵碼keydir的第i級(jí)子串,.W/命v(.;; w表示當(dāng)前指針 鍵碼keynMt的第i+l級(jí)子串,a表示構(gòu)成鍵碼子串的字符串全集中排序規(guī)則最小的字符 串,/表示分隔符;表示對(duì)于當(dāng)前指針鍵碼key_中使用Next方法返回一 個(gè)字符串subkeynext,Next方法具體是指針對(duì)當(dāng)前指針鍵碼keynext下所有子串可能構(gòu)成的 字符串全集中的任意字符串S,如果該字符串S大于或等于目標(biāo)鍵碼keydir的第i級(jí)子串 ",則將大于目標(biāo)鍵碼keydir的第丨級(jí)子串如秘響?且小于或等于該字符串s之間 的子串SubkeynexJt為結(jié)果返回;
[0106^ 4. 6)判斷當(dāng)前指針鍵碼keynext大于如式⑵所示字符串形式的鍵碼是否成立,如 果成立,則代表當(dāng)前指針鍵碼keynext所代表的如式(8)所示字符串形式的第η層鍵碼中已 無(wú)以式(1)所示字符串開(kāi)頭的鍵值對(duì)數(shù)據(jù),從當(dāng)前指針鍵碼 keynMt開(kāi)始,按照從小到大的 順序查找第一個(gè)大于如式(9)所示字符串形式的鍵碼作為當(dāng)前指針鍵碼 keynsxt;如果不成 立,則按照從小到大的順序查找第一個(gè)等于或大于如式(7)所示字符串形式的鍵碼作為當(dāng) 前指針鍵碼keynra£t ;
[0107] isubkey{^ / siibheyl^, /./ subkey'^ / α?Η' /., J tf' 〇
[0108] 式(7)中,鄭錄)ir表不目標(biāo)鍵碼keydir的第i級(jí)子串;α i+i表示第i+1級(jí)字符串 為構(gòu)成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串,αη表示第η級(jí)字符串為構(gòu) 成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串;/表示分隔符;
[0109] lsubkey{ev / subke^ $... f / 轉(zhuǎn))
[0110] 式⑶中,表示目標(biāo)鍵碼keydir的第η級(jí)子串,/表示分隔符;
[0111] /mbke^ imMe^i..Jmbk^ /?w /./of /#+1 (齡
[0112] 式(9)中,表示目標(biāo)鍵碼keydir的第i級(jí)子串;α w表示第i+1級(jí)字符串 為構(gòu)成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串,a n表示第η級(jí)字符串為構(gòu) 成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串;a n+1表示第η+1級(jí)字符串為構(gòu) 成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串;/表示分隔符;
[0113] 4. 7)檢測(cè)當(dāng)前指針Key鍵碼keynextS否已經(jīng)到達(dá)鍵值數(shù)據(jù)庫(kù)的文件尾部,如果尚 未到達(dá)文件尾部則跳轉(zhuǎn)執(zhí)行步驟4. 3);否則跳轉(zhuǎn)執(zhí)行步驟4.8);
[0114] 4. 8)將查詢結(jié)果集合Sret的內(nèi)容作為數(shù)據(jù)查詢請(qǐng)求的結(jié)果返回。
[0115] 本實(shí)施例中,將表示目標(biāo)鍵碼keydir目錄下所有可能鍵碼的下確界。 由層次化排序規(guī)則,易證明:一個(gè)數(shù)據(jù)庫(kù)中,式(1)所示字符串形式的Key&目錄下的所有 可能的鍵碼K1 一定滿足式(1〇)。
[0116] !subkey\ey / subkeyly /./ subkey1^ / a < K1 (lO j
[0117] 即鍵碼f大于或等于式(2)所示字符串。因此,將式(2)所示字符串使用目標(biāo)鍵 碼keydir目錄下所有可能鍵碼的下確η。:由于鍵值數(shù)據(jù)庫(kù)中的鍵碼是按序存 儲(chǔ)的,因此1的定義允許查詢方法迅速定位數(shù)據(jù)庫(kù)中第i層的key的起始位置。
[0118] 本實(shí)施例中定義了 Next ()方法,則Λ^λΥ(λ'μ/^:£〈γ^ )的含義如下:構(gòu)造一個(gè)比 略大,并且最接近于的subkeynext字符串。該字符串subkey MXt滿足: VsE {所食f串可能構(gòu)成的卞符串全集〗,若似則必有彡知 對(duì)于式⑴所示字符串形式的Keydir,其目錄下的最小鍵碼應(yīng)為式⑵所示字符串,且 Nexib^key1-)滿足Next(mbkeyley) = $ι?Ι(β}^+ *M"。:
[0119] 本實(shí)施例中,步驟4· 1)和4·5)中按照從小到大的順序查找具體是指從小到大的 順序進(jìn)行逐一順序查找、二分查找或者SkipList查找。其中,使用二分查找或者SkipList 查找能夠有效提升查找的效率,使得查找速度更快,從而能夠有效提升鍵值數(shù)據(jù)庫(kù)的查詢 性能。
[0120] 本實(shí)施例中,針對(duì)鍵碼Key的任何子串subkeykey均為僅由小寫字母組成的字符 串。假設(shè)鍵值數(shù)據(jù)庫(kù)已存儲(chǔ)如圖 6所示的數(shù)據(jù),其中虛線表示鍵值對(duì)(Key-Value對(duì)),實(shí)線 表示鍵碼(Key)的層次結(jié)構(gòu),則該數(shù)據(jù)在鍵值數(shù)據(jù)庫(kù)中順序存儲(chǔ)的key-value數(shù)據(jù)實(shí)例如 圖7所示。下面將結(jié)合上述數(shù)據(jù)以及具體的數(shù)據(jù)存儲(chǔ)請(qǐng)求或數(shù)據(jù)查詢請(qǐng)求來(lái)對(duì)本實(shí)施例執(zhí) 行數(shù)據(jù)存儲(chǔ)請(qǐng)求或者數(shù)據(jù)查詢請(qǐng)求的過(guò)程進(jìn)行詳細(xì)說(shuō)明。
[0121] (一)數(shù)據(jù)存儲(chǔ)請(qǐng)求。假設(shè)數(shù)據(jù)存儲(chǔ)請(qǐng)求的數(shù)據(jù)〈newKey,newValue〉為</b/d,5>, 即需要將</b/d,5>層次化存儲(chǔ)進(jìn)鍵值數(shù)據(jù)庫(kù),如圖8所示,其操作步驟如下:①、根據(jù)步驟 3. 1),接收用戶的數(shù)據(jù)存儲(chǔ)請(qǐng)求求</b/d, 5>,其中newKey為/b/d, newValue為5 ;②、根據(jù) 步驟3. 2),判定鍵值數(shù)據(jù)庫(kù)是否為空,如果鍵值數(shù)據(jù)庫(kù)為空,則直接將數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵值 對(duì)存入鍵值數(shù)據(jù)庫(kù)并退出;如果鍵值數(shù)據(jù)庫(kù)非空,則跳轉(zhuǎn)執(zhí)行下一步;③、根據(jù)步驟3. 3), 順序查找第一個(gè)大于或者等于數(shù)據(jù)存儲(chǔ)請(qǐng)求的newKey (/b/d)的目標(biāo)鍵碼existed_key,查 找得到的目標(biāo)鍵碼existed_key的值為/a/c/d ;④、根據(jù)步驟3. 4),將數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵值 對(duì)</b/d,5>插入保存在目標(biāo)鍵碼existecLkey對(duì)應(yīng)的鍵值對(duì)</a/c/d,4>前。鍵值數(shù)據(jù)庫(kù) 在執(zhí)行上述數(shù)據(jù)存儲(chǔ)請(qǐng)求后,最終得到的的數(shù)據(jù)實(shí)例如圖9所示。
[0122] (二)數(shù)據(jù)查詢請(qǐng)求。假設(shè)數(shù)據(jù)查詢請(qǐng)求的目標(biāo)鍵碼key&為/a,即查詢/a目錄 層次下的鍵碼與子目錄情況,則操作步驟如下:
[0123] 第一步:在鍵值數(shù)據(jù)庫(kù)中按照順序搜索第一個(gè)大于或者等于數(shù)據(jù)查詢請(qǐng)求目標(biāo)鍵 碼key dir目錄下所有可能鍵碼的下確界MinKeyi+1作為起始鍵碼keystart,將起始鍵碼key start 作為當(dāng)前指針鍵碼keynext ;由于目標(biāo)鍵碼keydir的字符串為/a,則目標(biāo)鍵碼keyi目錄下所 有可能鍵碼的下確界?為/a/a,第一個(gè)大于或者等于的起始鍵碼 keystart 為 /a/b。
[0124] 第二步:從起始鍵碼keystart開(kāi)始從數(shù)據(jù)庫(kù)順序獲取當(dāng)前指針鍵碼keyMxt。
[0125] 如圖10所示,針對(duì)當(dāng)前指針鍵碼keynMt = /a/b的查詢過(guò)程如下:①、由于/a目錄 下所有可能鍵碼的下確界MinKeyi+1為/a/a,根據(jù)步驟4. 1),順序查找數(shù)據(jù)庫(kù)中第一個(gè)大于 等于/a/a的起始鍵碼keystart,查找指針指向/a/b ;②、根據(jù)步驟4. 2),從起始鍵碼keystart =/a/b開(kāi)始進(jìn)行查詢操作;③、根據(jù)步驟4. 2),由于/a/b以/a開(kāi)頭、滿足 式兩個(gè)條件同時(shí)成立,所以將當(dāng)前指針鍵碼keynMt對(duì)應(yīng)的鍵值對(duì)</a/b,1>加入到查詢結(jié)果 集合SMt。
[0126]如圖11所示,針對(duì)keynext = /a/e的查詢過(guò)程如下:①、結(jié)束上一個(gè)當(dāng)前指針鍵碼 keynext(/a/b)的查詢過(guò)程,查找指針指向新的當(dāng)前指針鍵碼keyMxt(/ a/e);②、根據(jù)前述的 查詢過(guò)程步驟4. 2),由于/a/e以/a開(kāi)頭、滿足/a./形式兩個(gè)條件同時(shí)成立,所以 將當(dāng)前指針鍵碼keyMxt對(duì)應(yīng)鍵值對(duì)</a/e,2>加入到查詢結(jié)果集合S#。
[0127]如圖I2所示,針對(duì)keynra£t = /b/c的查詢過(guò)程如下:①、結(jié)束上一個(gè)當(dāng)前指針鍵碼 keynext(/a/e)的查詢過(guò)程,查找指針指向當(dāng)前指針鍵碼keyMxt(/b/c);②、根據(jù)前述的查詢 過(guò)程步驟1 2),由于/b/c以/b形式開(kāi)頭,不符合/a形式開(kāi)頭,則需要跳轉(zhuǎn)執(zhí)行步驟4. 6), 式(7)所示字符串為/a/a,式(8)所示的字符串為/a/a/ a,由于/b/c>/a/a,那么從幾久開(kāi) 始順序快速搜索出第一個(gè)大于/a/a/a的鍵碼(即/ a/c/d)作為當(dāng)前指針鍵碼keyn6Xt ;③、 由于當(dāng)前指針鍵碼keynf;xt(/a/c/d)沒(méi)有到達(dá)鍵值數(shù)據(jù)庫(kù)的文件尾部,因此跳轉(zhuǎn)執(zhí)行步驟 4.2),然后由于當(dāng)前指針鍵碼1^711_(/^(1)以/^形式開(kāi)頭符合步驟4.4)的條件,判定當(dāng) 前指針鍵碼key nfSt能匹配式(4)所示字符串形式的n層結(jié)構(gòu),式(3)所示字符串/a/c為目 標(biāo)鍵碼key dir的下一級(jí)目錄,將式(3)所示字符串形式的鍵碼以及子目錄標(biāo)識(shí)[dir]生成 鍵值</a/c, [dir]>對(duì)加入到查詢結(jié)果集合SMt。
[0128] 如圖I3所示,針對(duì)當(dāng)前指針鍵碼keym;xt = /a/c/f/g的查詢過(guò)程如下:①、承接前 面的操作,根據(jù)步驟4.3)查找指針從上一個(gè)當(dāng)前指針鍵碼keynext(/a/C/d)開(kāi)始,順序獲取 下一個(gè)當(dāng)前指針鍵碼keyMxt 、根據(jù)步驟4. 5),式(6)所示字符串為/a/c/a,因此順序查 找在本數(shù)據(jù)庫(kù)中第一個(gè)大于/a/c/a的當(dāng)前指針鍵碼keynext (即/a/c/f/g);③、由于當(dāng)前指 針鍵碼keynfSt/a/c/f/g以/a形式開(kāi)頭符合步驟4. 4)的條件,即當(dāng)前指針鍵碼keynra£t以字 符串式(1)開(kāi)頭、同時(shí)能匹配式(4)所示字符串形式的η層結(jié)構(gòu),因此跳轉(zhuǎn)步驟4. 4)。根 據(jù)步驟4. 4),判定式(3)所示字符串/a/c為目標(biāo)鍵碼keydir的下一級(jí)目錄,將式⑶所示 字符串形式的鍵碼以及子目錄標(biāo)識(shí)[dir]生成鍵值</a/c, [dir]>對(duì)加入到查詢結(jié)果集合 Sret。
[0129] 如圖14所示,針對(duì)keynMt = /b/d/e/f的查詢過(guò)程如下:①、查找指針移動(dòng)到當(dāng)前 指針鍵碼key_(/b/d/e/f),順序獲取key next :②、根據(jù)查找步驟4. 2)和4. 6),當(dāng)前指針鍵 碼key_t(/b/d/e/f)以/b形式開(kāi)頭,則不符合/a形式開(kāi)頭,式(7)所示字符串為/ a/a/a/ a,式(8)所不的字符串為/a/a/a/a/a,且/b/d/e/f>/a/a/a/a,那么從/b/c開(kāi)始順序快速 搜索出第一個(gè)大于/a/a/a/a/a的key,此時(shí)可知當(dāng)前指針鍵碼key next (/b/d/e/f)相鄰的鍵 碼到達(dá)數(shù)據(jù)庫(kù)文件尾部;③、執(zhí)行步驟4. 7),將查詢結(jié)果集合返回給用戶。
[0130] 以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,本發(fā)明的保護(hù)范圍并不僅局限于上述實(shí)施 例,凡屬于本發(fā)明思路下的技術(shù)方案均屬于本發(fā)明的保護(hù)范圍。應(yīng)當(dāng)指出,對(duì)于本【技術(shù)領(lǐng)域】 的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理前提下的若千改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也 應(yīng)視為本發(fā)明的保護(hù)范圍。
【權(quán)利要求】
1. 一種基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法,其特征在于實(shí)施步驟如下: 1) 預(yù)先在有序存儲(chǔ)的鍵值數(shù)據(jù)庫(kù)中構(gòu)建層次化鍵碼命名規(guī)則,所述層次化鍵碼命名規(guī) 則將鍵碼定義為以分隔符開(kāi)頭、且由分隔符和子串交替組合組成,分隔符的數(shù)量表示鍵碼 的級(jí)數(shù);確定兩個(gè)合法的鍵碼之間的大小比較方法,級(jí)數(shù)越大則鍵碼越大,級(jí)數(shù)相同的鍵碼 則根據(jù)字符串比較確定大?。? 2) 接收鍵值數(shù)據(jù)庫(kù)的訪問(wèn)請(qǐng)求,如果訪問(wèn)請(qǐng)求為數(shù)據(jù)存儲(chǔ)請(qǐng)求,則跳轉(zhuǎn)執(zhí)行步驟3), 如果訪問(wèn)請(qǐng)求為數(shù)據(jù)查詢請(qǐng)求,則跳轉(zhuǎn)執(zhí)行步驟4); 3) 根據(jù)所述兩個(gè)合法的鍵碼之間的大小比較方法來(lái)確定數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼排序位 置,然后按照排序位置將數(shù)據(jù)存儲(chǔ)請(qǐng)求的數(shù)據(jù)插入鍵值數(shù)據(jù)庫(kù),返回執(zhí)行步驟2); 4) 在鍵值數(shù)據(jù)庫(kù)中按照從小到大的順序查找第一個(gè)大于或等于數(shù)據(jù)查詢請(qǐng)求的目標(biāo) 鍵碼Iceytto目錄下所有可能鍵碼的下確界作為起始鍵碼keystart,從起始鍵碼keystart開(kāi)始, 按照從小到大的順序?qū)⑺幸阅繕?biāo)鍵碼keyto開(kāi)頭的鍵值對(duì)以及子目錄作為數(shù)據(jù)查詢請(qǐng)求 的結(jié)果返回。
2. 根據(jù)權(quán)利要求1所述的基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法,其特征在于,所 述步驟1)中確定的兩個(gè)合法的鍵碼之間的大小比較方法如下: I. 1)接收由keyl和key2組成的兩個(gè)合法的鍵碼; 1. 2)比較keyl和key2之間的級(jí)數(shù)大小,如果keyl和key2的級(jí)數(shù)不同,貝U跳轉(zhuǎn)執(zhí)行步 驟1.3),否則跳轉(zhuǎn)執(zhí)行步驟1.4); 1. 3)判斷keyl的級(jí)數(shù)大于key2的級(jí)數(shù)是否成立,如果成立則判定keyl比key2大,否 則判定key2比keyl大,返回比較結(jié)果并退出; 1. 4)初始化i為1 ; 1. 5)判斷keyl的級(jí)數(shù)大于或等于i是否成立,如果成立則跳轉(zhuǎn)執(zhí)行步驟1. 6);否則判 定keyl等于key2,返回比較結(jié)果并退出; 1. 6)判斷keyl和key2的前i級(jí)子串是否相等,如果相等則將i增加1,跳轉(zhuǎn)執(zhí)行步 驟1. 5);否則,判斷keyl的第i級(jí)子串大于key2的第i級(jí)子串是否成立,如果成立則判定 keyl比key2大,否則判定key2比keyl大,返回比較結(jié)果并退出。
3. 根據(jù)權(quán)利要求2所述的基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法,其特征在于,所 述步驟3)的詳細(xì)步驟如下: 3. 1)接收用戶的數(shù)據(jù)存儲(chǔ)請(qǐng)求<newKey,newValue>,其中newKey表示數(shù)據(jù)存儲(chǔ)請(qǐng)求的 鍵碼,newValue表示數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵值; 3. 2)判定所述鍵值數(shù)據(jù)庫(kù)是否為空,如果鍵值數(shù)據(jù)庫(kù)為空,則直接將所述數(shù)據(jù)存儲(chǔ)請(qǐng) 求的鍵值對(duì)〈newKey,newValue〉存入鍵值數(shù)據(jù)庫(kù)并退出;如果鍵值數(shù)據(jù)庫(kù)非空,則跳轉(zhuǎn)執(zhí) 行下一步; 3.3)順序查找第一個(gè)大于或等于所述數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey的目標(biāo)鍵碼existed-key; 3. 4)判斷所述數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey是否等于目標(biāo)鍵碼existed_key,如果所述 數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼newKey等于目標(biāo)鍵碼existed_key,則判定所述數(shù)據(jù)存儲(chǔ)請(qǐng)求的鍵碼 newKey在鍵值數(shù)據(jù)庫(kù)中是否已經(jīng)存在,將目標(biāo)鍵碼existed_key對(duì)應(yīng)的鍵值替換為數(shù)據(jù)存 儲(chǔ)請(qǐng)求的鍵值對(duì)〈newKey,newValue〉中的新鍵值newValue并退出;否則,將所述數(shù)據(jù)存儲(chǔ) 請(qǐng)求的鍵值對(duì)〈newKey,newValue〉插入保存在目標(biāo)鍵碼existed_key對(duì)應(yīng)的鍵值對(duì)前。
4.根據(jù)權(quán)利要求1或2或3所述的基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法,其特征 在于,所述步驟4)的詳細(xì)步驟如下: 4. 1)初始化查詢結(jié)果集合SMt ;在鍵值數(shù)據(jù)庫(kù)中按照從小到大的順序查找第一個(gè)大 于或等于數(shù)據(jù)查詢請(qǐng)求的目標(biāo)鍵碼keyto目錄下所有可能鍵碼的下確界作為起始鍵碼 keystart,將起始鍵碼keystart作為當(dāng)前指針鍵碼keynrart ;所述數(shù)據(jù)查詢請(qǐng)求的目標(biāo)鍵碼keyto 滿足式(1)所示字符串形式,所述目標(biāo)鍵碼keyto目錄下所有可能鍵碼的下確界符合式(2) 所示字符串形式; /Siibkey1kev /subkeyl^.I...ISubkey1kr (1) 式⑴中,表示目標(biāo)鍵碼keyto的第i級(jí)子串,i表示目標(biāo)鍵碼keydi,W級(jí)數(shù), /表不分隔符; Isubkeyley /SiibkeyleyI...ISitbkeVi^/a (2) 式(2)中,表示目標(biāo)鍵碼keyto的第i-1級(jí)子串;a表示構(gòu)成鍵碼子串的字符 串全集中排序規(guī)則最小的字符串;/表不分隔符; 4.2) 判斷當(dāng)前指針鍵碼keynra£t以式(1)所示字符串開(kāi)頭、匹配式(3)所示字符串形 式的第i+1層目錄兩個(gè)條件是否同時(shí)成立,如果同時(shí)成立則將當(dāng)前指針鍵碼keynext對(duì)應(yīng) 的鍵值對(duì)<keynra£t,Value〉加入到查詢結(jié)果集合SMt,后移查找指針得到新的當(dāng)前指針鍵碼 keynext,跳轉(zhuǎn)執(zhí)行步驟4.2);否則跳轉(zhuǎn)執(zhí)行步驟4.3); Isubkey1ley /SiibkeyleyI...ISiibkey1iey /subkey'^ (3) 式⑶中,-L0,表示目標(biāo)鍵碼keydi,的第i級(jí)子串,?^表示當(dāng)前指針鍵碼keynext的第i+1級(jí)子串,/表不分隔符; 4.3) 判斷當(dāng)前指針鍵碼keyn6Xt以字符串式(1)開(kāi)頭、同時(shí)匹配式(4)所示字符串形 式的n層結(jié)構(gòu)兩個(gè)條件是否仍然成立,如果成立則判定當(dāng)前指針鍵碼keynext位于目標(biāo)鍵碼 keyfc下的某一級(jí)子目錄中,跳轉(zhuǎn)執(zhí)行步驟4. 4),否則跳轉(zhuǎn)執(zhí)行步驟4. 6); /subkeyhImbkeyl。/?」subkeyUsubkey:Yi…ISubkeyniA) "- " *" ^c>'next^ceJnext 式⑷中,表示目標(biāo)鍵碼keydi,的第i級(jí)子串,表示當(dāng)前指針鍵碼 keyMxt的第i+1級(jí)子串,表示當(dāng)前指針鍵碼keyMxt的第n級(jí)子串,/表示分隔符; 4.4) 判定式(3)所示字符串形式的子目錄為目標(biāo)鍵碼keyto的下一級(jí)目錄,將式(3) 所示字符串作為鍵碼和子目錄標(biāo)識(shí)生成式(5)所示形式的鍵值對(duì)并加入到查詢結(jié)果集合 C ? k^ret; < /Suhkcylcx !suhkcyl^ !...!suhkcy'^ !Siihkcy1!1,[dir] > (5 ) ? - ~ ' ^eJnext 式(5)所示形式的鍵值對(duì)中,鍵碼為式(3)所示的字符串,鍵值[dir]表示子目錄標(biāo) 識(shí),/表不分隔符; 4. 5)跳過(guò)當(dāng)前指針鍵碼keyn6Xt對(duì)應(yīng)目錄下的所有鍵碼,從當(dāng)前指針鍵碼keyn6Xt開(kāi)始, 按照從小到大的順序查找第一個(gè)大于式(6)所示字符串形式的鍵碼作為新的當(dāng)前指針鍵 碼keynext,判斷新的當(dāng)前指針鍵碼keynext以式(1)所示字符串開(kāi)頭是否成立,如果成立則跳 轉(zhuǎn)執(zhí)行步驟4. 3),否則跳轉(zhuǎn)執(zhí)行步驟4. 6); Isuhkev^/Subkevley /..JSubkev1k /subkev1"1 /…INextisubkevn^)/a (6) "? "y * ^eJnexl * 人%?1 式(6)中,表示目標(biāo)鍵碼keyto的第i級(jí)子串,表示當(dāng)前指針鍵碼keynra£t的第i+1級(jí)子串,a表不構(gòu)成鍵碼子串的字符串全集中排序規(guī)則最小的字符串,/ 表示分隔符;表示對(duì)于當(dāng)前指針鍵碼keymxt中使用Next方法返回一個(gè)字 符串Subkeynext,所述Next方法具體是指針對(duì)當(dāng)前指針鍵碼keynext下所有子串可能構(gòu)成的 字符串全集中的任意字符串s,如果該字符串s大于或等于目標(biāo)鍵碼keyto的第i級(jí)子串 ,則將大于目標(biāo)鍵碼keyto的第i級(jí)子串小于或等于該字符串s之間的 子串Subkeynext作為結(jié)果返回; 4.6)判斷當(dāng)前指針鍵碼keyMxt大于如式(7)所示字符串形式的鍵碼是否成立,如果成 立,則代表當(dāng)前指針鍵碼keynext所代表的如式(8)所示字符串形式的第n層鍵碼中已無(wú)以 式(1)所示字符串開(kāi)頭的鍵值對(duì)數(shù)據(jù),從當(dāng)前指針鍵碼keyMxt開(kāi)始,按照從小到大的順序查 找第一個(gè)大于如式(9)所示字符串形式的鍵碼作為當(dāng)前指針鍵碼keyMxt;如果不成立,則按 照從小到大的順序查找第一個(gè)等于或大于如式(7)所示字符串形式的鍵碼作為當(dāng)前指針 鍵碼keynext; /Subkey1tey /SubkeyleyI./subkev'key /a!+1 /./a? (7) 式(7)中,表示目標(biāo)鍵碼keyto的第i級(jí)子串;ai+1表示第i+1級(jí)字符串為構(gòu) 成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串,an表不第n級(jí)字符串為構(gòu)成鍵 碼子串的字符串全集中排序規(guī)則最小的字符串的子串;/表不分隔符; Isubkey1key./SiibkeyleyI...ISitbkeynker/ (8) 式⑶中,表示目標(biāo)鍵碼keydi,的第n級(jí)子串,/表示分隔符; /Siibkey1ky /SiibkeyleyI...ISubkey1ksty /a,+1 /.., /a? /aB+1 (9) 式(9)中,表示目標(biāo)鍵碼keyto的第i級(jí)子串;ai+1表示第i+1級(jí)字符串為構(gòu) 成鍵碼子串的字符串全集中排序規(guī)則最小的字符串的子串,an表不第n級(jí)字符串為構(gòu)成鍵 碼子串的字符串全集中排序規(guī)則最小的字符串的子串;an+1表不第n+1級(jí)字符串為構(gòu)成鍵 碼子串的字符串全集中排序規(guī)則最小的字符串的子串;/表不分隔符; 4. 7)檢測(cè)當(dāng)前指針Key鍵碼keynext是否已經(jīng)到達(dá)鍵值數(shù)據(jù)庫(kù)的文件尾部,如果尚未到 達(dá)文件尾部則跳轉(zhuǎn)執(zhí)行步驟4.3);否則跳轉(zhuǎn)執(zhí)行步驟4.8); 4.8)將查詢結(jié)果集合SMt的內(nèi)容作為數(shù)據(jù)查詢請(qǐng)求的結(jié)果返回。
5. 根據(jù)權(quán)利要求4所述的基于鍵值數(shù)據(jù)庫(kù)的層次化存儲(chǔ)與查詢方法,其特征在于:所 述步驟4. 1)和4. 5)中按照從小到大的順序查找具體是指從小到大的順序進(jìn)行逐一順序查 找、二分查找或者SkipList查找。
【文檔編號(hào)】G06F17/30GK104268280SQ201410552673
【公開(kāi)日】2015年1月7日 申請(qǐng)日期:2014年10月17日 優(yōu)先權(quán)日:2014年10月17日
【發(fā)明者】李 根, 盧凱, 王雙喜, 遲萬(wàn)慶, 周旭, 唐宏偉, 劉勇鵬, 馮華, 王小平, 蔣杰, 高穎慧, 王睿伯, 張英, 樊葆華 申請(qǐng)人:中國(guó)人民解放軍國(guó)防科學(xué)技術(shù)大學(xué)