leveldb資料庫的version介紹

2021-09-13 16:03:28 字數 1741 閱讀 2565

之前分享了leveldb的相關操作,其中compaction操作會導致磁碟儲存檔案的增加與刪除,那在查詢資料的時候是否會存在被查檔案被刪掉的可能呢?答案是不會的,本文就來看看leveldb自身的版本控制。

我們從版本的結構,生成,使用,和銷毀四個部分來說明。

版本的結構:結構定義如下,我們在查詢中重點關注的是 levels tfiles屬性。儲存了當前版本所有的檔案,以及session屬性,session在這裡也有乙個很重要的屬性是fileref,fileref是檔案的引用次數。

type version struct
版本的管理主要是圍繞著版本version,檔案tfiles,檔案f引用fileref來實現的。

版本的生成:之前在將compaction的時候提到過乙個spawn函式,具體的實現可以去檢視原始碼。生成新版本的過程簡單描述如下:1、獲取到當前版本stversion,2、將當前版本stversion中的檔案刪除掉合併的檔案,新增新的檔案 3、重新排序檔案(level0層的檔案根據檔案id排序,大於0層的檔案根據key的大小排序),排序的目的是為了提高查詢效率,4、然後將新生成的version設定為stversion,**如下:

func (s *session) setversion(v *version) 

​ s.stversion = v

}

根據以上**可以看出,在設定新版本的時候,會有乙個incref(),該函式將新版本中所有檔案引用計數加1,然後釋放老的版本,將新版本v的設定為當前版本stversion。所以,stversion中存的一直都是最新的版本。

版本的使用:在get操作的時候,需要獲取到版本資訊,可以認為是乙個快照版本。前文介紹get操作時,查詢記憶體找不到後,需要查詢磁碟檔案有乙個獲取version的動作,如下

v := db.s.version()//version()實現如下

func (s *session) version() *version

value, csched, err := v.get(auxt, ikey, ro, false)

v.release()

所以,每次查詢都獲取的是當前最新的版本。注意:當前最新的版本不一定一直是最新的版本,比如v.get還沒完成的時候,compaction生成了新的版本的時候。

版本的銷毀:每乙個版本版本使用完成,比如上述get完成後,compaction新生成版本後,都會進行版本的釋放**,**如下:

func (v *version) releasenb()  else if v.ref < 0 

​ for _, tt := range v.levels

​ }

​ }

​ v.released = true

}

以上**可知,只要檔案的引用次數大於0,檔案就不會被刪除。

舉個小例子:

現有版本1,對應a , b ,c 三個檔案,三個檔案的引用計數均為1

get操作,v = 版本1,此時 a ,b, c 三個檔案的引用計數均為2

compaction操作,生成新的版本2: c,d,e 三個檔案,其中c的引用是3次,d,e的引用次數是1次。 因為有新版本,所以需要**版本1,**之後,a,b的引用次數變為1,c的引用次數變為2,d e的應用次數變為1.

get操作完成後,釋放版本v, 此時 ab的引用次數變為0,刪掉ab檔案,c的引用次數變為1

結束。

LevelDB資料庫的安裝和測試

cd leveldb make all 編譯完成之後在當前目錄多了兩個目錄 out shared和out static 在out static目錄下有我們需要的libleveldb.a 3,測試 在leveldb out shared,目錄下執行 可以檢視leveldb的版本,效能等 前面是一些關於...

leveldb之資料庫損壞,修復

搜尋leveldb看到了乙個討論 還在 地方貼出了 他的主要問題是 兩個執行緒 同時 進行 快速 開啟leveldb 操作 關閉leveldb。而且 還是 while 1 迴圈級別 leveldb傷不起啊 太快了,導致leveldb可能有所損壞。所以 leveldb程式開發方法應該是 在程序 開始 ...

資料庫 基礎資料庫的操作

什麼是資料庫 資料庫 database 是按照資料結構來組織 儲存和管理資料的倉庫 常見的資料庫oracle mysql sun db2 ibm sql server microsoft postgre sql 專業術語 資料庫系統 database system dbs 資料庫 database ...