本篇文章給大家分享的是有關(guān)如何利用leveldb實現(xiàn)文件系統(tǒng)的目錄樹,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡營銷推廣、網(wǎng)站重做改版、東安網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5響應式網(wǎng)站、成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為東安等各大城市提供網(wǎng)站開發(fā)制作服務。
目錄樹維護了整個文件系統(tǒng)的元信息,所有對文件系統(tǒng)中文件的增刪查改操作都首先需要經(jīng)過目錄樹的操作才能進行。百度開源的分布式文件系統(tǒng)BFS(開源地址:https://github.com/baidu/bfs)利用leveldb,實現(xiàn)了目錄樹的管理,使得目錄樹的實現(xiàn)非常簡潔,同時對目錄樹的操作十分高效。本文將為你解析其具體設計及實現(xiàn)思路。
目錄樹為一個樹型結(jié)構(gòu),而leveldb是一個kv存儲引擎,因此,如果想用通過leveldb實現(xiàn)目錄樹,則需要把樹型結(jié)構(gòu)映射成kv的扁平化結(jié)構(gòu)。
單獨就每個文件或者目錄來講,其信息只需要一條kv記錄即可保存,而這條kv中的value需要保存該目錄或文件的屬性信息,可變動的空間不大。所以,從樹型結(jié)構(gòu)到kv記錄的映射 ,關(guān)鍵在于key的選取。
在BFS的目錄樹中,定義了一個int64_t
的整型數(shù)字作為EntryID
,每個文件或目錄擁有一個EntryID
,并且全局唯一,根目錄的EntryID
規(guī)定為1。假設有如下目錄結(jié)構(gòu):
/home/dirx/ /filex diry/ /filey /tmp/ filez
按照創(chuàng)建順序,我們依次給/home
分配的EntryID
為2,/tmp
的EntryID
為3,/home/dirx
的EntryId
為4,/home/diry
的EntryID
為5,/home/tmp/filez
的EntryID
為6,/home/dirx/filex
的EntryID
為7,/home/diry/filey
的EntryID
為8。
注意到每個目錄擁有一個自己的EntryID
的同時,又肯定擁有一個父目錄,其父目錄又肯定擁有一個EntryID
,可以利用這一點,通過父目錄的EntryID
和子目錄中的文件名,來確定一條記錄的key:對于每個文件或者目錄,我們規(guī)定:每條kv記錄的key為 "父目錄的EntryID
+自身文件名",同時在value中存儲自己的EntryID
這樣編碼后,上述目錄樹便可以表示為如下kv記錄:
1home -> 2 + xxx 1tmp -> 3 + xxx 2dirx -> 4 + xxx 2diry -> 5 + xxx 3filez -> 6 + xxx 4filex -> 7 + xxx 5filey -> 8 + xxx
其中,xxx
表示該目錄或文件的其它信息,如大小,創(chuàng)建時間,實際數(shù)據(jù)存放位置等。
到此,目錄樹這個樹型結(jié)構(gòu),便已經(jīng)平展成為一條條的kv記錄,對目錄樹的操作,便轉(zhuǎn)化成了對某幾條kv記錄的操作:
對于創(chuàng)建文件操作,比如想創(chuàng)建/home/work/
目錄,則首先在/
目錄中查找home
目錄,由于/
的EntryID
為1,所以第一次查找時,key為1home
,然后讀出其value,解析后發(fā)現(xiàn)/home
的EntryID
為2,則將此EntryID
記下,繼續(xù)往下走,發(fā)現(xiàn)work
即為所需要創(chuàng)建的文件,則為其申請一個EntryID
(假設為9),此時,寫入一條記錄,按照上面的規(guī)則,其key為2work
,value為work
創(chuàng)建的時間等信息,以及work
的EntryID
(9)
對于刪除操作,比如把剛剛創(chuàng)建的/home/work
目錄刪除,只需要將key為2work
的這條記錄刪除即可
對于讀取操作,比如想讀取/home/dirx/filex
文件中的內(nèi)容,則首先讀取1home
這條key所對應的value,解析發(fā)現(xiàn)value中記錄的EntryID
為2,然后再去讀取2dirx
這條key所對應的value,解析發(fā)現(xiàn)value中記錄的EntryID
為4,然后再去讀取4filex
這條key所對應的value,從里面解析出/home/dirx/filex
的實際數(shù)據(jù)存放位置,進行文件內(nèi)容的讀取
對于List目錄操作,比如想看看根目錄下有哪些文件和目錄,由于每個文件和目錄在存儲時,其key中都包含父目錄的EntryID
,因此,只需進行一次掃描即可。比如ls /
,則只需掃描leveldb中,以1\0x0
為前綴的key即可,當遇到2時停止,所得結(jié)果即為/
目錄下的所有內(nèi)容
對于Rename操作,只需要改動其key即可。比如想要把/home/diry/filey
文件移動到home/dirx
目錄中,按照之前的規(guī)則,/home/diry/filey
在leveldb中存儲的key為5filey
,/home/dirx
的EntryID
為4,把5filey
這條記錄中的內(nèi)存讀取出來,以4filey
為key,再次存儲到leveldbk ,然后將5filey
這條記錄刪除,即完成了Rename操作
這樣,一個目錄樹所需要的基本操作便已經(jīng)支持,由于leveldb引擎本身寫入速度較快,并且在讀取時,內(nèi)部本身已經(jīng)有cache來緩存住較熱的kv數(shù)據(jù),并且緩存大小可配置,所以一個非常簡潔高效的目錄樹便實現(xiàn)了~
以上就是如何利用leveldb實現(xiàn)文件系統(tǒng)的目錄樹,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站欄目:如何利用leveldb實現(xiàn)文件系統(tǒng)的目錄樹
標題來源:http://muchs.cn/article18/jpedgp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站設計、動態(tài)網(wǎng)站、商城網(wǎng)站、服務器托管、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)