標籤:
【LevelDb日知錄之五:MemTable詳解】
LevelDb日知錄前述小節大致講述了磁碟檔案相關的重要靜態結構,本小節講述記憶體中的資料結構Memtable,Memtable在整個體系中的重要地位也不言而喻。總體而言,所有KV資料都是儲存在Memtable,Immutable Memtable和SSTable中的,Immutable Memtable從結構上講和Memtable是完全一樣的,區別僅僅在於其是唯讀,不允許寫入操作,而Memtable則是允許寫入和讀取的。當Memtable寫入的資料佔用記憶體到達指定數量,則自動轉換為Immutable Memtable,等待Dump到磁碟中,系統會自動產生新的Memtable供寫操作寫入新資料,理解了Memtable,那麼Immutable Memtable自然不在話下。
LevelDb的MemTable提供了將KV資料寫入,刪除以及讀取KV記錄的操作介面,但是事實上Memtable並不存在真正的刪除操作,刪除某個Key的Value在Memtable內是作為插入一條記錄實施的,但是會打上一個Key的刪除標記,真正的刪除操作是Lazy的,會在以後的Compaction過程中去掉這個KV。
需要注意的是,LevelDb的Memtable中KV對是根據Key大小有序儲存的,在系統插入新的KV時,LevelDb要把這個KV插到合適的位置上以保持這種Key有序性。其實,LevelDb的Memtable類只是一個介面類,真正的操作是通過背後的SkipList來做的,包括插入操作和讀取操作等,所以Memtable的核心資料結構是一個SkipList。
SkipList是平衡樹的一種替代資料結構,但是和紅/黑樹狀結構不相同的是,SkipList對於樹的平衡的實現是基於一種隨機化的演算法的,這樣也就是說SkipList的插入和刪除的工作是比較簡單的。
關於SkipList的詳細介紹可以參考這篇文章:http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html,講述的很清楚,LevelDb的SkipList基本上是一個具體實現,並無特殊之處。
SkipList不僅是維護有序資料的一個簡單實現,而且相比較平衡樹來說,在插入資料的時候可以避免頻繁的樹節點調整操作,所以寫入效率是很高的,LevelDb整體而言是個高寫入系統,SkipList在其中應該也起到了很重要的作用。Redis為了加快插入操作,也使用了SkipList來作為內部實現資料結構。
參考:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html
LevelDb日知錄之五:MemTable詳解