美文网首页leveldb
leveldb(2) 并发写入

leveldb(2) 并发写入

作者: 宋大壮 | 来源:发表于2019-03-31 15:38 被阅读0次

写入流程

  1. 先加锁
  2. 往队列里加入数据(有可能有别的线程也加入数据)
  3. wait等待队首数据的线程被唤醒(此时其它数据可以写入队列)
while (!w.done && &w != writers_.front()) {
​    w.cv.Wait();
  }
  1. 持有队首数据的线程被唤醒,获取最新的sequence
  2. 获取当前队列里的最后一个数据
  3. 将当前队首至队尾的数据(为了批量写入)整合
  4. 解锁(此时后面的线程又可以写入队列,因为队首到队尾的数据已经被缓存),且第一个插入的线程为新的队首,wait等待唤醒(步骤2)
  5. 插入数据
  6. 上锁操作队列,将此线程队首至队尾的数据都置为已读,并且唤醒相关数据的线程(这样唤醒的时候发现w.done,自己的数据已经和别人的一起写进去了,所以直接返回)
  7. 唤醒此时新的队首

leveldb多线程写的关键

经过系统性的分析,我们了解到leveldb实现高性能安全读写的几个关键点:

  1. 利用队列将写入线程排队有序执行,写操作实现了逻辑上的单线程操作;
  2. 在写入文件和MemTable过程是无锁状态,此时可以同时写入和读取数据,合并多个数据写入进一步提升写入性能;
  3. 利用原子指针代替锁避免了锁本身带来的线程切换开销;
  4. 如果通过迭代器遍历节点时,因为写入和读取指针都是原子的,所以也不存在安全问题;

同时读写为何是安全的

  1. 整个写入过程操作链表的时候有两个步骤,分别是先让节点指向后向节点,然后再让前向节点指向自己,第一步因为没有实际操作链表,所以本身就是安全的,只有第二步执行的过程如果线程切换或者同时读取(毕竟都是多核的机器)才会有可能存在不安全的可能;
  2. 无论是写入还是读取(通过迭代器顺序读取除外),都是先要seek,即定位,seek是从高到低方式访问链表逐渐逼近期望节点,而节点插入是从低到高插入链表,一旦seek过程访问了还没有插入完毕的节点时,该节点的低于当前高度的链表已经插入完毕,所以也不存在安全问题;
  3. 单向链表插入实际上只有一步操作,只要这个操作是原子的可以保证安全。
  4. 因为MemTable没有删除操作,永远是添加操作,也进一步巩固了该设计方案

相关文章

  • leveldb(2) 并发写入

    写入流程 先加锁 往队列里加入数据(有可能有别的线程也加入数据) wait等待队首数据的线程被唤醒(此时其它数据可...

  • Leveldb之并发写入

    这篇文章想分析下Leveldb的写入流程以及Leveldb是如何处理并发写入问题的。阅读https://githu...

  • leveldb源码学习--memtable之Key

    leveldb中数据存储过程 当向leveldb写入数据时,首先将数据写入log文件,然后在写入memtable内...

  • 从leveldb中学编码技巧(2)

    leveldb提供的接口大部分都是线程安全的,包括write。当多个线程并发的调用write时,leveldb会保...

  • 无标题文章

    大并发写入案例: 高并发,大数据量写入:先把数据写入到内存,积累到一定的量后,在定时或者定量的写入到磁盘(减少磁盘...

  • 利用GCD实现高效的文件读取

    需求思路 读取时候可以并发进行,读取后要返回读取状态。 写入文件时候不可以读取,并且文件写入时不可以并发的进行写入...

  • Fabric和CouchDB

    因为良好的追加写入性能,从比特币到以太坊再到Hyperledge的Fabric,都选用了LevelDB作为存储方案...

  • 使用leveldb模块

    LevelDB是谷歌开源的一个键值数据库,速度非常快,同时自动压缩数据。 起因是直接写入文本不方便第二次查找;写入...

  • [LevelDB/源码]Batch结构分析

    1.Batch的日常使用 batch的日常使用比较简单,使用Batch是提高leveldb写入性能的一个关键。 本...

  • SStable的写入 - KV存储-LevelDB/RocksD

    请教:简书如何写代码块? Overview Index Block andData Block 2.Index B...

网友评论

    本文标题:leveldb(2) 并发写入

    本文链接:https://www.haomeiwen.com/subject/hnqubqtx.html