本篇是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版本