为什么leveldb/rocksdb只允许一个线程修改memtable?

leveldb/rocksdb采用deque控制多线程只允许一个线程修改memtable, 是由于memtable不存在读-写冲突(采用MVCC,保证Sequence一定不同,memtable的key就一定不同,update/delete/insert操作一定不会修改已有key的数据)

这样只存在写-写冲突,只需要保证memtable只有一个写,就能保证线程安全。

这里使用一个deque,把所有线程的写write_batch放入这个deque中,只允许队头的线程写memtable,其他线程cv.wait,从而保证只有一个线程写。

而且其他线程在入队cv.wait等待同时,队头的线程还会进行合并其他线程的write_batch,这样就能以最小的代价保证整体系统的线程安全,提高系统的吞吐。

posted @ 2023-02-13 16:38  misaka-mikoto  阅读(95)  评论(0编辑  收藏  举报