levaldb寫入資料(6)

2021-08-06 05:30:15 字數 2100 閱讀 8633

這裡主要介紹增刪改查的一些操作,可是這裡有一些奇怪的問題,比如資料過長時候灰產生的bug等等,這裡暫時不介紹,主要關注主要流程,具體引數等以後一一介紹。

先看增加,

db_->put(leveldb::writeoptions(),"love","life");
這個是增加,我們可以很簡單的找到是dbimp中的write()函式實現了寫入操作,具體**如下:

status dbimpl::write(const writeoptions& options, writebatch* my_batch) 

if (w.done)

// may temporarily unlock and wait.

status status = makeroomforwrite(my_batch ==

null); //

uint64_t last_sequence = versions_->lastsequence();

writer* last_writer =

&w; if (status.ok() && my_batch !=

null)

} //寫到log檔案中,

if (status.ok())

mutex_.lock();

if (sync_error)

}if (updates == tmp_batch_) tmp_batch_->clear();

versions_->setlastsequence(last_sequence);

}

這裡寫入操作為了實現非同步,也是費盡了心機,這裡稍加解釋,吧所有要寫入的內容寫入到乙個list中,等待前面沒內容或者這條內容已經寫入(其他執行緒給寫入了),就不在等待。makeroomforwrite()這個其實內容挺多的,但是這裡寫入少量資料,基本不會出錯的,這裡就暫時不用搞出空間,開始真正的寫入,

log_->addrecord(writebatchinternal::contents(updates));
這個是寫入到log檔案中,其實也就是特定的乙個檔案,用來下次恢復內容,這裡設計有點奇怪,但是我也說不清楚,不想深入研究這個東東,寫入記憶體是

writebatchinternal::insertinto(updates, mem_);

status writebatchinternal::insertinto(const writebatch* b,

memtable* memtable)

status writebatch::iterate(handler* handler) const

virtual

void put(const slice& key, const slice& value)

void memtable::add(sequencenumber s, valuetype type,

const slice& key,

const slice& value)

typedef skiplistchar*, keycomparator> table;

table table_;

這裡廢了好大勁,就是這種,關於skiplist,到底是啥,這裡暫時不去介紹,我們現在預設他是乙個list即可。

status dbimpl::get(const readoptions& options,

const slice& key,

std::string* value)

關於membertable的get這裡暫時也不詳細介紹,主要流程大概就是這樣,所有的資料都儲存在mem_中

關於刪除

status db::delete(const writeoptions& opt, const slice& key) 

virtual void delete(const slice& key)

這裡等了好久,終於讀完了dbimp的主要流程,發現又遇到乙個坑,這裡我們慢慢踩,這些**,我總有一天,可以啃完,以後可以慢慢分析一下指標和引用等一些知識,

python 寫入資料

呼叫 open 時提供了兩個實參第乙個實參也是要開啟的檔案的名稱 第二個實參 w 告訴 python 我們要以 寫入模式 開啟這個檔案。開啟檔案時,可指定 讀取模式 r 寫入模式 w 附加模式 a 或讓你能夠讀取和寫入檔案的模式 r 如果你省略了模式實參,python 將以預設的唯讀模式開啟檔案。如...

hive 資料寫入

hive表中資料的寫入主要有 insert into overwrite values insert select load create table as select datatable 這幾種方式。其中hive從0.14版本開始支援 insert into table values line ...

寫入資料java將資料寫入到csv檔案

這兩天一直在查詢寫入資料之類的問題,下午正好有機會和大家討論一下.對於csv件文,因為要將資料分離的寫入到個一每單元格中。用什麼來開分以後單元格和下乙個單元格之間呢?這裡就用到了 逗號可以割分單元格。舉例說明 我們這裡用乙個輸出流將資料寫入到csv件文中 fileoutputstream fos n...