leveldb常見問題以及性能優化點

本篇是leveldb最後一篇,這裏主要把技術核心點,性能提升點或者面試可能會被問到進行總結。

一、常見問題

1、leveldb key-value內存,內存中保存的是所有key-value嗎?  
答:不是 搜索順序,memtable immtable ldb文件 

2、布隆過濾器 在leveldb中的應用是什麼?
答:布隆過濾器主要應用查找方面,如果查找一個key在過濾器中返回false,那麼一定不存在文件中。leveldb默認沒有開啓布隆過濾器功能。

3、有一個比較舊的數據key-value,假設在第6層,現在對其進行刪除,然後執行流程是什麼?
答:直接創建一條標記爲Delete的記錄,插入到db即可。在查詢的時候,level級別越低數據新鮮程度越高,從低層層次開始查詢,如果查到了並且標記是刪除,那麼就返回給用戶記錄被刪除。後面合併數據時例如:合併level5, level6時纔會把數據真正從物理磁盤中刪除掉。

4、leveldb SequenceNumber 達到最值之後  
答:assert

5、爲什麼level0中文件不應該太多?
答:因爲level0中文件包含的key是可以重疊的,文件太多不方便查詢,而level1~level6 文件中key不重複

6、VersionSet中包含多個Version? 每個version都是幹嘛的?

對象 作用
VersionSet Version集合,所有的Version都掛在VersionSet對象下面,一個db只有一個VersionSet
Version 一個db可能存在多個Version,Version之間採用鏈表方式管理,鏈表最後節點爲當前最新Version信息
VersionEdit 該對象用於生成最新的Version。VersionEdit + 當前使用的Version 生成 新的Version存放到鏈表尾部,只在需要生成新的Version時纔會創建

7、leveldb中SkipList爲什麼沒有提供刪除接口?
答:leveldb對於刪除操作也是插入流程,只不過是將插入數據標記爲刪除,存到SkipList中. 既然刪除操作也是插入流程,那麼leveldb是如何判斷當前節點是否刪除呢? 判斷標記

8、當MemTable佔用內存達到門限值後,就會將MemTable寫入到文件,那麼這個 文件一定屬於level0嗎?
答:不一定,要看MemTable中最小值和最大值與level0中是否有重疊,如果沒有重疊則可能將新生成文件放到更高的level中,具體函數實現可參考PickLevelForMemTableOutput

二、leveldb優化點

1、table cache 使用LRU算法,該cache默認存儲62條數據,當達到62條時就會把lrucache中數據刪除,可以擴大。

2、MemTable默認大小是4M,我們可以擴大。

3、leveldb默認沒有開啓布隆過濾器,我們可以在創建Options對象的時候指定開啓過濾器。

三、其他

MemTable:默認大小爲4M,當Memtable佔用4M大小時,就將MemTable寫入到文件中.

Level0:level0文件數據不應該過多,默認是4個文件,每個文件大小位XXM,

Level1:每個文件大小爲10M

Level2:每個文件大小爲100M

LevelN:每個文件大小爲LevelN-1 * 10 (上一層文件大小乘以10)

 

leveldb中幾個數字:

NextFileNumber -- 控制  .log  Manifest  .ldb 文件名字中數字

LastSequence   -- 用於設置WriteBatch的Sequence Number.。不是遞增而是根據這個批任務中有多個key-value對進行設置的,具體參考函數DBImpl::Write

LogNumber       -- 表示當前Version中使用的 .log文件

PrevLogNumber -- 表示當前Version中保存的上一個.log文件  #該參數目前版本沒有意義,只是爲了向前兼容leveldb版本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章