txdb 原始碼分析系列(三)

2021-08-20 02:21:18 字數 3914 閱讀 1779

class

public:

bool fmemory = false, bool fwipe = false,

bool obfuscate = false);

};

cdatastream 我們簡單理解為乙個記憶體 buffer,read()傳入的key是經過泛化的乙個k,經過 serialize 之後,相當於乙個記憶體的 slice,sskey << key;將這個記憶體 slice 寫入記憶體 buffer-->sskey 中,之後使用 leveldb 的 slice 方法寫入,sskey.data()代表首位址 ,sskey.size()表示其大小。

之後我們構造乙個 string 的strvalue,呼叫 leveldb的 get(),傳入readoptions讀選項,slkey和構造好的 string 的strvalue

最後,我們通過ssvalue去 leveldb 中拿到我們所要的 value,並經過 xor(異或運算)進行解碼之後,ssvalue >> value;把值塞回給 read 的 value 引數,這樣,我們就通過確定的 key 拿到其對應的 value。

在上述過程中,我們發現,我們從leveldb中拿到的值是經過 xor 編碼之後寫入的,我們最後讀取出來需要經過 xor 解碼的過程,那麼編碼的過程在**呢?很明顯,讀的逆向操作是 write 操作。

template bool read(const k &key, v &value) const 

try catch (const std::exception &)

return

true;

}

在這個函式中,我們能清楚的理解到,write函式首先呼叫cdbbatch的write函式,最後返回writebatch批量寫函式,所以,我們寫入leveldb的過程是乙個批量寫的過程。

template

bool

write

(const k &key, const v &value, bool fsync = false)

write 函式的引數同樣是泛化過的 k,v,我們通過sskey << key;ssvalue << value;將key 和 value 塞進記憶體 buffer 中,最後通過 xor 編碼之後,呼叫 put 函式寫入 leveldb 中,leveldb::slice slkey(sskey.data(), sskey.size());依舊表示的是首位址以及大小,slvalue同理。

class

cdbbatch

writebatch的引數fsync 判斷write的過程是否為同步write。

bool

writebatch

(cdbbatch &batch, bool fsync = false)

;

exists 函式的引數是乙個泛化後的 key,通過 key 可以判斷該 key 所對應的 value 究竟是否在 leveldb 中存在。

template bool exists(const k &key) const 

return

true;

}

erase函式與write函式同理,首先呼叫cdbbatch中的erase函式,最後返回writebatch。不同的是 erase 函式用來刪除傳入的 key 所定位到的 value。

template

bool

erase

(const k &key, bool fsync = false)

思路同理,同樣是泛化後的key,寫入記憶體buffer --->sskey中,然後通過leveldb::slice判斷這個key的首位址和大小,呼叫batch.delete(slkey);將其刪除。

sskey.clear();代表刪除記憶體中的臨時變數。

template void

erase

(const k &key)

flush函式需要注意,它並不適用於leveldb,不是我們想象中的將要寫入的資料flush到leveldb中, 只是提供與bdb的相容性:

bool

flush

()

sync函式用來判斷批量寫入的時候是否採用同步的方式:

bool

sync

()

該函式返回的返回值是cdbiterator:

cdbiterator *newiterator

()

下面我們來分析一下cdbiterator

class

cdbiterator ;

~cdbiterator();

}

換句話說,cdbiterator就是對leveldb::iterator的封裝,並且封裝了如下函式來供使用

seek 函式,通過泛化的 key 寫入 sskey,之後獲取首位址以及大小,傳入leveldb內部的seek函式來實現查詢的功能。

template void

seek

(const k &key)

其他函式同理,主要實現有:

bool

valid

(); //確認是否有效

void

seektofirst

(); //從頭開始找

void

next

(); //獲取下乙個元素

bool

getkey

(k &key)

//獲取key

intgetkeysize

()//獲取key的size

bool

getvalue

(v &value)

//獲取value

intgetvaluesize

()//後去value的size

isempty函式返回乙個bool型別,他的作用和她的字面意思是一樣的,如果isempty 管理的資料庫不包含資料,則返回true。

bool

isempty

();

leveldb::range ranges[2];

ranges[0] = leveldb::range("a", "c");

ranges[1] = leveldb::range("x", "z");

uint64_t sizes[2];

size_t estimatesize

(const k &key_begin, const k &key_end)

const

Redis原始碼分析系列

redis目前熱門nosql記憶體資料庫,量不是很大,本系列是本人閱讀redis原始碼時記錄的筆記,由於時間倉促和水平有限,文中難免會有錯誤之處,歡迎讀者指出,共同學習進步,本文使用的redis版本是2.8.19。redis之hash資料結構 redis之intset資料結構 redis之skipl...

jQuery原始碼分析系列

斷斷續續地看jquery原始碼,第一次萌生看jq原始碼的念頭,當時還是版本1.7.2,由於工作中沒有用到jq的機會,連 有幾種用法都還不知道,就開始啃原始碼,痛苦自然是少不了的,於是不久就放棄扔一邊了。等到工作中終於就機會用jq了 撒花 又萌生了啃jq原始碼的念頭,此時jq版本已經是2.0了。鑑於瀏...

jQuery原始碼分析系列

版本截止到2013.8.24 jquery官方發布最新的的2.0.3為準 附上每一章的原始碼注釋分析 正在編寫的書 jquery架構設計與實現 本人在慕課網的教程 完結 jquery原始碼解析 架構與依賴模組 64課時 jquery原始碼解析 dom與核心模組 64課時 jquery原始碼分析目錄 ...