最近在做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的方式的優點是什麼呢?