非專業levelDB源碼解析1

最近在做NoSQL方面的項目。項目開始之前,先學習當今比較主流的NoSQL數據庫,從levelDB開始。

關於levelDB的架構分析,參考了網上的《LevelDb日知錄》,就不狗尾續貂了。

直接從源碼分析起。


首先從創建一個DB講起。

LevelDB中創建或打開一個新的DB很容易。

    // Open a database
    leveldb::DB* db;
    leveldb::Options options;
    options.create_if_missing = true;
    leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
    assert(status.ok());



這裏用到了3個類,DB,Option和Status。

Status用來存儲和檢查狀態的,先跳過不講。


從Options講起:

Options是一個結構體,其中保存了大量的控制信息,用來控制數據庫行爲。

還有另兩個相關的結構體,ReadOptions和WriteOptions分別來進行讀寫操作。



其中比較重要的變量有:

comparator:指定數據比較時方法。默認爲Bytewise。

env: 保存了與當前系統環境交互的方式。

compression:制定數據壓縮的方式,默認爲snappy。


對於ReadOptions


可以設置snapshot,snapshot的概念類似於數據庫中的view,每個snapshot對應某一個版本的數據庫。如果用戶不指定snapshot,則會使用當前狀態下的snapshot。

以後再單獨分析snapshot的創建。


WriteOptions則比較簡單,只有一個bool sync來設置是否需要同步寫入。


類DB用來實現數據庫的各種操作,從其函數中可以看到各種基本操作。 它只是一個純虛類,具體的實現方法是由DBImpl完成。DBImpl作爲levelDB裏面最主要的類,承載了大部分的功能實現。


從DB類的定義中可以看出,對於數據的寫入和讀取,都使用了Slice的方式,而不是直接的字符串方式的操作。那麼Slice的方式的優點是什麼呢?




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