原创 leveldb源碼剖析--編碼

leveldb是一個google出品的單機kv數據庫。用C++編寫,代碼量很小,大概只有1~2萬行。代碼寫的可以用優雅來形容,毫無疑問是我至今看到的最優雅的c++代碼。而且由於代碼量比較小,可以直接通讀整個源碼,瞭解一個完整的kv

原创 leveldb源碼剖析---filter block

前面我們分析了leveldb中的index block和data block。這裏主要是分析filter block。filter block屬於一種metadata block,它的構造主要由FilterBlockBuilde

原创 leveldb源碼剖析--數據寫入(DBImpl::Write)

前面我們介紹了leveldb中數據的編碼 ,數據在內存中的存儲形式(MemTable),數據在磁盤中的存儲格式(sstable),以及sstable的形成過程等等。本篇博文將從leveldb用戶的角度,詳細走一遍leveldb用戶

原创 leveldb源碼剖析--MemTable

前言 根據前一篇可以知道,leveldb在磁盤中的存儲模型是sstable,sstable總的來說就是存儲一個一個的key-value信息序列以及一些管理信息。用戶一般是通過leveldb的用戶接口 Status Put(con

原创 C語言中的變長數組 data[0]

本文裝載自:http://www.cnblogs.com/Anker/p/3744127.html 主要是在看leveldb源碼時, SkipList::Node裏面的port::AtomicPointer next_[1]定義有

原创 leveldb源碼剖析---迭代器設計

本篇主要介紹leveldb中的迭代器設計。迭代器設計封裝了leveldb中的所有遍歷操作。一個好的設計思想應該是:每個存在容器的地方,就應該有對應容器的迭代器的設計。leveldb是一個容器,leveldb中的每個level中的所

原创 Nginx源碼剖析--ngx_cycle_s結構體分析

前言 Nginx框架是圍繞着ngx_cycle_t結構體運行的。ngx_cycle_t結構體中包含的信息主要可以分爲以下部分: 所有模塊的配置信息 Nginx運行時所需要的一些資源,包括連接池,內存池,打開文件,操作目錄等等

原创 leveldb源碼剖析-sstable

leveldb中存儲數據的文件格式稱爲sstable。它的存儲格式如下圖所示 從sstable的格式可以看出,在一個sstable文件中,除了包含核心的key-value數據的data block區域外,還有其他幾個數

原创 leveldb源碼剖析----compaction

根據前面的分析,背景線程的主體工作在BackgroundCompaction函數中完成。這個函數主要完成以下兩個工作: 如果imm_非空,則將imm_寫入到磁盤中生成新的sstable文件 對level中的文件進行合併。合併的目

原创 leveldb源碼剖析---DBImpl::MakeRoomForWrite函數的實現

前言 前面我們說過,leveldb用戶通過調用write或者put函數向數據庫中寫入數據實際上是將數據寫入到levedb的Memtable中。我們也曾經提到過,leveldb中有兩個MemTable,分別是imm_和mem_,其中

原创 leveldb源碼剖析--TableBuilder生成磁盤sstable

TableBuilder 將數據寫入磁盤生成sstable的工作由TableBuilder類完成。顧名思義,TableBuilder負責中封裝了sstable的生成格式,它對用戶的接口主要是 void Add(const Sl

原创 leveldb源碼剖析---版本管理

所謂的版本,簡單地說,指的是leveldb中各個level層的文件信息。顯然,隨着compaction的進行和新的memtable寫入生成新的sstable,版本會不斷變化。版本除了記錄各層的文件信息外,還記錄各層關於compac

原创 leveldb源碼剖析---日誌系統

前言 日誌就是記錄數據庫增刪記錄的文件。之所以需要記錄這些東西,主要是爲了防止萬一數據庫運行期間異常崩潰導致的數據丟失。而之所以會出現數據丟失,原因在於我們在往數據庫中寫數據時,並不是真的將數據庫寫入到了磁盤中,而可能只是將數據暫

原创 產生死鎖的必要條件和解決方法

死鎖:多個進程爲了競爭資源而造成的僵局,如果沒有外力作用,這些進程將再也不能向前推進。 產生死鎖的原因: 1. 競爭系統資源 2. 進程的推進順序不當 產生死鎖的必要條件: 互斥條件: 進行要求對其分配的資源進行排他控

原创 將數組分成兩部分,使得這兩部分的和的差最小

將一個數組分成兩部分,不要求兩部分所包含的元素個數相等,要求使得這兩個部分的和的差值最小。比如對於數組{1,0,1,7,2,4},可以分成{1,0,1,2,4}和{7},使得這兩部分的差值最小。 思路: 這個問題可以轉化爲求數組