Leveldb源码分析7 数据查找

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的序列化。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值