RocksDB读流程

       简而言之,在RocksDB中的读取需要处理的最核心的一个问题就是如何读取最新的数据,这是由于RocksDB是基于LSM,因此在RocksDB中,对于数据的delete以及update,它并不会立即去执行对应的动作,而只是插入一条新的数据,而数据的最终更新(last-write-win)以及删除是在compact的时候来做的.

       其实最那就是如何读取到一个数据的最新版本,因此首先我们需要知道在RocksDB中,多个版本的数据是如何保存的。首先我们需要知道在RocksDB中,数据是保存在两个地方,一个是memtable(内存),一个是sstable(磁盘),因此RocksDB读取数据也是依次从这两个地方读取.

   1. memtable.

      在RocksDB中memtable的默认实现是skiplist,RocksDB会将用户传入的key改变为memtable内部的key(user_key+seq+type),然后再加上用户传入的value之后,作为一个element加入到skiplist.因此我们读取的时候需要读取到最新的那条数据.

        skiplist跳表结构,可以方便快速查询key;

        seq方便找到最新的数据;

        type记录了数据状态(插入、删除、merge);

问题:已被删除的key,在数据库中能否找到,还是状态被标记为Delete;

    2. sstable.

         在RocksDB中,除去level0之外的sstable是保证不会overlap,因此在这些sstable中,只要get到值,那么就可以进入下一个level了,而在level0中则需要读取所有的sstable

        除了Level0,其他底层Level,每个sstable块的索引是不交叉的,不重叠;

猜你喜欢

转载自blog.csdn.net/u012151242/article/details/131217974
今日推荐