class BlockBuilder
[功能]
class BlockBuilder
生成prefix-compressed key
的数据块, 输出为一个 Slice
每个key-value块的存储格式为:
form | data type |
---|---|
shared_bytes of key: | varint32 |
unshared_bytes of key: | varint32 |
bytes of value: | varint32 |
key_delta: | char[unshared_bytes] |
value: | char[value_bytes] |
shared_bytes of key 表示当前 key 与前一个 key 共享的前缀字节数
key1 = "abdkejf"
|||
key2 = "abdjieksljd"
shared_bytes = 3
前缀带来的问题是key
与key
之间的依赖, 无法利用数据的有序性来进行快速二分查找, leveldb
的作者提供了一个Options::block_restart_interval
字段来设置restart
点, 每隔Options::block_restart_interval
条数据都重新共享前缀, 因此leveldb可以通过直接二分查找restart
点对应的key
restart点的存储格式为:
form | data type |
---|---|
restarts | uint32[num_restarts] |
num_restarts | uint32 |
restarts[i]
存储着相对于block
的offset
[idea]
block
的设计不是太难理解, 主要的地方应该就是前缀与重启点的设计了, 权衡了存储空间与查找效率, 与stl::sort算法的 快速排序->(堆排序,插入排序) 的设计有异曲同工之妙