目的是:为了防止写入kv时被阻塞。
设想,如果没有immutable memtable,当memtable满了之后后台线程需要将memtable 立即flush到新建的sst中,在flush的过程中,新的KV记录是无法写入的,只能等待,就会造成新写入的KV记录被阻塞。
盗一个其他人的图如下:
延伸:在leveldb中只有两个memtable:memtable和immutable memtable;但是在rocksdb中,memtable的数量是可以配置的,当memtable中的数据量超过设定值后,默认是64MB,就会转变为一个immutable memtable,后台线程就会将immutable memtable通过pipe形式,以异步批量的方式flush到level0层中新建的sst文件,如果该新建的sst文件与level 0层其他sst文件中的key的范围有重叠的就会留在level 0层中,否则就会向上推到level 1最高推到level 2层中。