leveldb只是单纯的在文件末尾增加,并不改写原有的内容,那么如果删除一个key,或者更新一个key应该怎么办呢?比如:
table["liming"] = 18
del table["liming"]
table["liming"] = 20
table["liming"] = 21
leveldb将每一个操作变化成如下的格式:
userkey sequence type : value
// user_key: 即用户存储的key
// 比如 table["liming"] = 18 table["wangdong"] = 20
// "liming", "wangdong" 就是user_key。
// sequence为操作序列号
// type操作是删除还是更新
// value是值
上面的一系列操作就变为:
liming 1 kTypeValue : 18
liming 2 kTypeDeletion
liming 3 kTypeValue : 20
liming 4 kTypeValue : 21
内部按照key非递减,sequence非递增,kTypeValue非递增排序(保证kTypeDeletion在前面)进行排序(存储在SkipList中),这样查询时便可以找到key对应的最新值,如果type位kTypeDeletion则不存在。
下面介绍一下什么是user_key MemTableKey InternalKey LookupKey
Memtable的内容是:
key_size : varint32 of internal_key.size()
key_bytes : char[internal_key.size()]
value_size : varint32 of value.size()
value_bytes: : char[value.size()]
[ksize][---InternalKey---][vsize][---value---]
MemTableKey为:[ksize][---InternalKey---]即InternalKey的序列化
InternalKey的格式
[--------user_key-------- ][sequence type]
[ 低8字节 ]
如何获得user_key
Slice(internal_key.data(), internal_key.size() - 8 )
LookupKey
[klength][--------user_key-------- ][sequence type]
[klength][-------------internal_key---------------]
为什么要LookupKey? 主要是和内部MemTableKey一致。
为什么要InternalKey?把MemTableKey从内存中读出来就是InternalKey,及Memtable_key是InternalKey的序列化。