leveldb-编码

来源:互联网 发布:剑灵狂三捏脸数据 编辑:程序博客网 时间:2024/06/05 04:54

参考这个链接[ leveldb源码剖析–编码],把为什么要编码以及如何编码讲的比较清楚。
我再简单记录下我自己的学习心得。主要是回答几个问题,回答清楚就行了。


  1. 为什么要编码?

假设key = “hello”, value=”world”,对于这个pair,你应该怎么存储呢?显然直接存成一个字符串可以。但是,那么怎么知道谁是key谁是value .所以,建议的存储方式:key_len, key, value_len, value.
那么,问题来了。ken_len, value_len你要怎么存?可以这么存:
5hello5world.
但是,如果key是数字,并且大于两位呢?key=”1010101010”,那么按照上面的方式:101010101010是这么存。
你根本分不清楚到底谁是key_len,谁是key.所以,底层存储数字的时候需要编码!


2 . 怎么编码

leveldb将数字按连续的字节直接存储。有两种方式:定长和不定长。
定长很容易:以32位为例,前四个字节存数字,然后是ascii码。每次读取都先读前四个,然后再读四个。
对于变长有一点技巧了。先说,为什么要变长。因为不变长,可能会浪费空间。但是,变成,我怎么知道要去读几个字节。所以,leveldb采用一种方法,对于32位的数字,这32位都是有效位。但是,我现在要求,每7位加一个最高位用来标记这是数字。
那么,先把32位补齐了,32+3 = 35 % 7 = 0;然后每7位字节,加一个最高位.8*5 = 40。所以,一个32位数字,变长编码,最多可以存40位。高位置1的原因在于,对于字符编码ascii来说,最高为全部是0.这样就可以区别。

原创粉丝点击