leveldb 程式碼閱讀三

lihaihui199102發表於2024-06-05

options 解讀

Options 資料庫設定

壓縮型別

//資料庫內容儲存在一組塊中,每個塊包含一個鍵、值對序列。
//在儲存到檔案中之前,可以壓縮每個塊。
//下面的列舉描述用於壓縮塊的壓縮方法(如果有)。
enum CompressionType {
  	kNoCompression     = 0x0,
  	kSnappyCompression = 0x1
};

Options 結構

struct LEVELDB_EXPORT Options {
  	//比較器用於定義表中鍵的順序。
	//預設值:使用字典式位元組順序的比較器
	//要求:客戶機必須確保這裡提供的比較器具有相同的名稱,並且ORDERS鍵*與以前在同一資料庫上開啟呼叫時提供的比較器完全相同。
  	const Comparator* comparator;

  	// If true, the database will be created if it is missing.
  	//為真時,當資料庫丟失時建立資料庫物件
  	// 預設為false
  	bool create_if_missing;

  	// 為真時, 如果資料庫存在則會引發錯誤
  	// 預設: false
  	bool error_if_exists;

  	// 為真時,則實現對正在處理的資料進行積極的檢查,如果檢測到任何錯誤,則將提前停止
  	// 這可能導致一些不可預見的結果:例如,一個資料庫條目的損壞可能導致大量條目無法讀取或整個資料庫無法開啟
  	// 預設值:false
  	bool paranoid_checks;

  	//用一個特殊物件和環境變數進行互動.
  	// 預設值: Env::Default()
  	Env* env;

  	// 如果資料庫生成的任何內部進度/錯誤資訊非空,則將其寫入資訊日誌;
  	// 如果資訊日誌為空,則將寫入與資料庫內容儲存在同一目錄中的檔案。
  	// 預設值:空
  	Logger* info_log;

  	// 該引數會影響效能
  	// 寫緩衝大小
  	// 預設值: 4MB
  	size_t write_buffer_size;

  	// 資料庫可以使用的開啟的檔案數;
  	// 如果資料庫有較大的工作集,則需要增加此值
  	// 預設值: 1000
  	int max_open_files;

  	// 控制塊 (使用者資料儲存在一組塊中,塊是從磁碟讀取的單位).
  	// 不為空, 則對塊使用指定的快取.
  	// 為空, leveldb 將自動建立並使用8MB的內部快取.
  	// 預設值: nullptr
  	Cache* block_cache;

  	// 每個塊壓縮的使用者資料的近似大小。特別注意的是,次數指定的塊大小對應於未壓縮的資料。
  	// 如果啟用壓縮,從磁碟讀取的單元的實際大小可能會更小。此引數可以動態更改。
  	// 預設值: 4K
  	size_t block_size;

  	// 鍵的增量編碼的重新啟動點之間的鍵數。此引數可以動態更改。大多數客戶機應該只保留此引數。
  	// 預設值: 16
  	int block_restart_interval;

  	// 儲存的檔案大小
  	// 預設值: 2MB
  	size_t max_file_size;

  	// 使用指定的壓縮演算法壓縮塊。此引數可以動態更改。
	//預設值:ksnappycompression,它提供輕量但快速的壓縮。
	//在Intel(R)Core(TM)2 2.4GHz上ksnapycompression的典型速度:
	//~200-500MB/s壓縮
	//~400-800MB/s解壓
	//請注意,這些速度明顯快於大多數持久儲存速度,因此通常不值得切換到knocompression。
    //即使輸入資料不可壓縮,ksnappycompression實現也會有效地檢測到這一點並切換到未壓縮模式。
  	CompressionType compression;

  	// 為真時,則開啟資料庫時附加到現有清單和日誌檔案.  這可以顯著加快開啟速度.
  	// 預設值:目前為false,以後可能為真.
  	bool reuse_logs;

  	// 當此值部位空時,用指定的篩選策略來減少磁碟讀取。
  	// 許多程式此處都會傳遞布隆過濾器
  	const FilterPolicy* filter_policy;

  	Options();
};

ReadOptions 讀設定

// Options that control read operations
struct LEVELDB_EXPORT ReadOptions {
  ReadOptions() = default;

  // If true, all data read from underlying storage will be
  // verified against corresponding checksums.
  <!如果為ture,所有讀取資料都會校驗>
  bool verify_checksums = false;

  // Should the data read for this iteration be cached in memory?
  // Callers may wish to set this field to false for bulk scans.
  <!從迭代器讀取的資料是否要快取在記憶體中,
    資料批次掃描可能希望為false>
  bool fill_cache = true;

  // If "snapshot" is non-null, read as of the supplied snapshot
  // (which must belong to the DB that is being read and which must
  // not have been released).  If "snapshot" is null, use an implicit
  // snapshot of the state at the beginning of this read operation.
  <!快照,有快照就讀取快照資料,沒快照就正常讀取>
  const Snapshot* snapshot = nullptr;
};

WriteOptions 寫設定

// Options that control write operations
struct LEVELDB_EXPORT WriteOptions {
  WriteOptions() = default;

  // If true, the write will be flushed from the operating system
  // buffer cache (by calling WritableFile::Sync()) before the write
  // is considered complete.  If this flag is true, writes will be
  // slower.
  //
  // If this flag is false, and the machine crashes, some recent
  // writes may be lost.  Note that if it is just the process that
  // crashes (i.e., the machine does not reboot), no writes will be
  // lost even if sync==false.
  //
  // In other words, a DB write with sync==false has similar
  // crash semantics as the "write()" system call.  A DB write
  // with sync==true has similar crash semantics to a "write()"
  // system call followed by "fsync()".
  <!是否寫同步,同步寫是慢於非同步寫的,但不會造成資料丟失,
    如果是非同步寫,只有在機器重啟的情況下才會造成資料丟失,
    其它情況這不會丟失>
  bool sync = false;
};

相關文章