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原始碼分析目錄 ...