leveldb源码阅读(一)

这篇博客主要探讨了leveldb的源码,重点在于`slice.h`中的字符串类实现,`coding.h`里的空间压缩技术和`table/block_builder.cc`的块构建过程。`slice.h`提供了简单的字符串操作;`coding.h`用于高效存储,避免空间浪费;`block_builder.cc`描述了键值对如何组织成block,并存储每个键在block内的偏移量。通过示例解释了数据结构的实际存储形式。
摘要由CSDN通过智能技术生成

include/leveldb/slice.h

slice是leveldb内部使用的字符串类,代码很简单。

该类只有两个数据成员:

	const char* data_;
	size_t size_;

函数成员也很简单,如通过各种方式构造,比较,移除前缀等等。

util/coding.h

coding这个类是用来类型转换和压缩空间的,比如声明一个uint32类型的变量,要分配4个字节的空间,如果这个uint32只是用了1个字节,浪费 3 个字节,而Leveldb中记录长度的uint变量非常多,不压缩的话就会浪费大量的空间

// 将 char* 转换为 uint32_t
inline uint32_t DecodeFixed32(const char* ptr) {
   
  // 小端模式直接拷贝
  if (port::kLittleEndian) {
   
    // Load the raw bytes
    uint32_t result;
    memcpy(&result, ptr, sizeof(result));  // gcc optimizes this to a plain load
    return result;
  } else {
   
  	// 大端模式还需要转换
    return ((static_cast<uint32_t>(static_cast<unsigned char>(ptr[0])))
        | (static_cast<uint32_t>(static_cast<unsigned char>(ptr[1])) << 8)
        | (static_cast<uint32_t>(static_cast<unsigned char>(ptr[2])) << 16)
        | (static_cast<uint32_t>(static_cast<unsigned char>(ptr[3])) << 24));
  }
}

util/coding.cc

// 将数字v重新编码,然后放到dst中
// 做法是将一个字节分为两部分,最高位,即第8位存放是否还需要继续编码,低7位表示数据
// 如数字360,二进制为101101000,需要两个字节
// 00000001 01101000
// 00000010 11101000
// 可以看出第8位为1,说明还有数据要编码,如果为0,则已经没有数据需要编码了
char* EncodeVarint32(char* dst, uint32_t v
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值