1. 程式人生 > >LevelDB讀寫流程(具體例子講解SkipList+LSM)

LevelDB讀寫流程(具體例子講解SkipList+LSM)

有任何問題請聯絡我:[email protected]

LevelDB是LSM最有名的實現系統。網上介紹的文章不少, 本文主要用於我自己的理解和備忘錄,我將用具體的例項來介紹LevelDB的讀寫過程,希望能讓讀者更加清楚其細節是如何實現的。

總體來說,LevelDB是LSM+SkipList來實現的。具體來說,memtable是SkipList, sstable是LSM。SkipList的結構如下圖所示:


SkipList是一個有序的list。如上圖例子中,key依照字母排序。既然是一個list,那麼只要找到對應位置後,插入新的元素只需要一個操作即可,即斷開原來的連結串列,插入新的元素即可。SkipList每個節點,除了其基本的元素外,還包括了額外的幾個元素(具體幾個可以當引數來設定)。那麼查詢的效率為O(logN),具體證明可以見原始paper。

上面說了,對於插入而言,找到新的位置後,插入的效率為O(1),那麼總的插入效率自然和查詢效率一直,即也是O(logN). 對SkipList的簡要介紹到此結束。


LevelDB的在記憶體中的資料結構就是SkipList。如上圖所示,只不過除了key之外,每個還包括了對應的value。例如NodeA,其key是A1001,value是一個字串xiaoming。LevelDB在記憶體中的資料結構稱之為memtable和immutable,其實都是SkipList,只不過memtable到了一定程度就是隻讀的了,就變成了immutable。那麼新來的寫入和更新操作都要新啟一個memtable來進行。這樣的話memtable和immutable就可能含有相同的key。查詢的時候是先從memtable開始找,如果找到了就返回,找不到再找immutable,因此就算memtable和immutable有兩個一樣的key,那麼因為memtable是先被找到,並且memtable含有的資料是最新的,因此返回也是最新的。

當immutable到達一定數量的時候,就要被置換到磁碟上,如上圖所示的Level0,其每一個檔案都是immutable置換過來的。注意,這個過程沒有Merge,就是把記憶體中的資料挪到磁碟上(我們不是資料的創造者,我們只是資料的搬運工)。上文我們提到,memtable和immutable是有可能有相同key的,也就是說immutable之間也可能有相同的key。所以Level0中的檔案是有可能有相同的key的。因此當查詢的時候,如果需要查詢Level0,就需要查詢多個檔案,然後比較最後的結果,選擇最新的。當然也可以做些優化,我們暫時不提。

當Level0中的檔案數量達到一定的時候,就要進行真正的Merge。如果有相同的key,merge的時候要把老的資料去掉,因此從Level1開始,sstable檔案之間不會出現相同的key。所以如果能定位到一個檔案含有要查詢的key,那麼這一層就不用再去查詢別的檔案了。

相關推薦

LevelDB流程具體例子講解SkipList+LSM

有任何問題請聯絡我:[email protected] LevelDB是LSM最有名的實現系統。網上介紹的文章不少, 本文主要用於我自己的理解和備忘錄,我將用具體的例項來介紹LevelDB的讀寫過程,希望能讓讀者更加清楚其細節是如何實現的。 總體來說,Leve

hadoop學習筆記:hdfs體系結構和流程

sim 百萬 服務器 發表 繼續 什麽 lose 基於 一次 原文:https://www.cnblogs.com/codeOfLife/p/5375120.html 目錄 HDFS 是做什麽的 HDFS 從何而來 為什麽選擇 HDFS 存儲數據 HDFS

Exyons4412音訊驅動----初始化之暫存器流程

核心載入驅動: module_init(snd_soc_init);  載入完成之後進入:snd_soc_init() 初始化函式 static int __init snd_soc_init(void) { #ifdef CONFIG_DEBUG_FS snd_soc

HBase --- 流程

整體流程 讀寫流程主要分為兩大部分: Client從MetaTable路由到Region所在的Region Server; Client直接與對應的Region Server進行互動;     

HDFS流程重點

@[toc] # 寫資料流程 ①服務端啟動HDFS中的`NN和DN`程序 ②客戶端建立一個分散式檔案系統客戶端,由客戶端向NN傳送請求,請求上傳檔案 ③NN處理請求,檢查客戶端是否有許可權上傳,路徑是否合法等 ④檢查通過,NN響應客戶端可以上傳 ⑤客戶端根據自己設定的塊大小,開始上傳`第一個塊`,預設0-12

使用Spring實現分離 MySQL實現主從復制

sign eve replicat win [] 做了 用戶名 指定 ati 1. 背景 我們一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大,有一個思路就是說采用數據庫集群的方案, 其中一個是主庫,負責寫入數據,我們稱之為:寫庫; 其它都是從庫,

MMM架構實現MySQL高可用分離進階版,包含Amoeba

meid _id status mysqld 服務無法啟動 flush 忽略 kit pri 前兩天逛博客偶然發現了某大神寫的關於MMM的文章,看完就迫不及待的自己試了一下,大神寫的很順暢,以為自己也能操作的很順暢,但是實際情況是手腳太不麻利,碰到很多坑,如果大神的

【C語言】檔案常用操作含讀取學生資訊示例

C檔案概述 檔案是指一組相關資料的有序集合。這個資料集有一個名稱,叫做檔名。實際上我們在C語言程式設計中已經多次使用了檔案。例如源程式檔案(.c)、目標檔案(.0bj)、可執行檔案(.exe)、庫檔

Java檔案操作FileInputStream、FileReader、BufferedReader

1.位元組流和字元流選擇 位元組流:位元組流讀取的時候,讀到一個位元組就返回一個位元組; 主要用於讀取圖片,MP3,AVI視訊檔案。 字元流:字元流使用了位元組流讀到一個或多個位元組,如讀取中文時,就會一次讀取2個位元組。只要是處理純文字資料,就要優先考慮

HDFS檔案的具體流程

HDFS讀寫檔案的具體流程 1.圖解寫檔案 2.流程詳解 3.圖解讀檔案 4.流程詳解 1.圖解寫檔案 2.流程詳解 1.客戶端通過Distributed FileSystem(分散式檔案系統)模組向NameNode請求

Ceph 學習——OSD流程與原始碼分析

直接上圖: 同樣當前最新的版本,和之前的版本有所不同,有一些模組簡化了,類的名字也改了。先介紹圖中涉及的相關的類,然後在對類中具體函式主要呼叫流程進行分析。 OSD 模組主要的類 盜圖:其中ReplicatedPG 在最新的版本中

MySQL Proxy 分離實戰總結

mysql proxy;讀寫分離 規劃: 主mysql服務器:192.168.1.21 從mysql服務器: 192.168.1.22 mysql讀寫分離器:192.168.1.23 1、讀寫分離服務器上解壓安裝包,並添加對應用戶,並編輯啟動腳本; # tar xf mysql-proxy-

Mycat實現分離

mycatMycat介紹Mycat是一個國產中間件產品,作用在應用層和數據庫之間架橋,使應用通過MyCat來對後端數據庫進行管理,是一款國人自主的開源的中間件產品。算是比較優秀的一款,前身是阿裏公司在維護,很多公司也慢慢的在嘗試接入這個產品,但不得不說官方文檔似乎做的不太友好。至於為什麽選擇MyCat可能只有

線程同步之鎖操作的補充

允許 資源 加鎖 函數 申請 tex bject def 讀取 輕量級的讀寫鎖(Slim Reader-Writer locks):讀寫鎖實際是一種特殊的自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者只對共享資源進行讀訪問,寫者則需要對共享資源進行寫操作。這種鎖相對於

HDFS文件流程簡單圖解

http pla ges jpg eight 簡單 系統 mage pan 在活動反思文件系統中 HDFS文件讀寫流程簡單圖解

使用Spring+MySql實現分離spring整合多數據庫

ont 依據 xml配置 實現 整合 配置 item 匹配 mic 緊接著上一章,因為現在做的項目還是以spring為主要的容器管理框架,所以寫以下spring如何整合多個數據源。 1. 背景 我們一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大

hbase流程

ems 服務 region flush 以及 hba 表數據 new 剛才 HBase讀數據流程 1) HRegionServer保存著meta表以及表數據,要訪問表數據,首先Client先去訪問zookeeper,從zookeeper裏面獲取meta表所在的位置信息,即找

linux塊設備流程

臨時 無效 rect patch 得到 喚醒 處理 字符 構建 在學習塊設備原理的時候,我最關系塊設備的數據流程,從應用程序調用Read或者Write開始,數據在內核中到底是如何流通、處理的呢?然後又如何抵達具體的物理設備的呢?下面對一個帶Cache功能的塊設備數據流程進行

企業 - mysql 分離proxy

mysql 讀寫分離(proxy) MySQL ProxyMySQL Proxy是一個處於你的client端和MySQL server端之間的簡單程序,它可以監測、分析或改變它們的通信。它

Java操作HDFS開發環境搭建以及HDFS的流程

Hadoop CDH HDFS Java操作HDFS 大數據 Java操作HDFS開發環境搭建 在之前我們已經介紹了如何在Linux上進行HDFS偽分布式環境的搭建,也介紹了hdfs中一些常用的命令。但是要如何在代碼層面進行操作呢?這是本節將要介紹的內容: 1.首先使用IDEA創建一個ma