在介绍内存数据库之前,首先介绍一下内存数据库的键值编码规则。由于内存数据库本质是一个kv集合,且所有的数据项都是依据key值排序的,因此键值的编码规则尤为关键。

    内存数据库中,key称为internalKey,其由三部分组成:

    • 序列号:leveldb中,每一次写操作都有一个sequencenumber,标志着写入操作的先后顺序。由于在leveldb中,可能会有多条相同key的数据项同时存储在数据库中,因此需要有一个序列号来标识这些数据项的新旧情况。序列号最大的数据项为最新值;
    • 类型:标志本条数据项的类型,为更新还是删除;

    内存数据库中所有的数据项都是按照键值比较规则进行排序的。这个比较规则可以由用户自己定制,也可以使用系统默认的。在这里介绍一下系统默认的比较规则。

    默认的比较规则:

    • 首先按照字典序比较用户定义的key(ukey),若用户定义key值大,整个internalKey就大;
    • 若用户定义的key相同,则序列号大的internalKey值就小;

    以goleveldb为示例,内存数据库的定义如下:

    其中kvData用来存储每一条数据项的key-value数据,nodeData用来存储每个跳表节点的链接信息

    • 第二个字节用来存储本节点key值长度;
    • 第三个字节用来存储本节点value值长度;
    • 第四个字节用来存储本节点的层高;
    • 第五个字节开始,用来存储每一层对应的下一个节点的索引值;

    PutGetDeleteIterator等操作均依赖于底层的跳表的基本操作实现,不再赘述。