你也可以通过我的独立博客 —— www.huliujia.com 获取本篇文章
背景
LevelDB在内存中存储key、value时,最后是以单值形式存储到一个跳跃表中的,跳跃表我们在上一篇文章LevelDB源码解析之SkipList(跳跃表)聊过了。这里主要想谈一下,LevelDB是如何把key、value编码到一个单值里面的,顺带分析一下为什么要这样做。
思考题
如何把一对key、value编码到一个单值中呢?很自然的一个想法是用冒号做分割,存储成key:value这种格式。但是如果key或者value里面有冒号怎么办?总不能规定不允许使用冒号吧?所以使用特殊符号做区分是不够通用的。
一种常见的方法是用size-value的方式。比如先用4字节存储key的size,然后再存储key,再存储value的size和value。这种方式避免了使用特殊符号分割的局限性,通用性是OK的。缺点是多了两个size域,额外占用8个字节的存储。如果key和value都是比较小的,那么size域产生的存储开销就很可观了。假设key和value也都是4个字节,总共8个字节。size域的8个字节就使用了一半的存储空间了。
既然key和value这么小,我能不能只用2个字节存储size呢?如果key和value的大小能够限制在2^18大小,这样是可以的。但是如果有的key或者v