boltdb introduction

boltdb是一个设计简单, go实现的kv数据库, 代码量虽少, 但是功能五脏俱全, 而且性能不错, 如果打算学习下kv storage engine, boltdb绝对是一个好的开始。

boltdb的所有数据都存储在一个单文件里,mmap映射到内存,以page作为基本数据操作单位, page主要有meta(元数据), freelist(可使用的page), branch(index), leaf(data)四种, 数据是以b+ tree组织的,通过cow实现mvcc,即当发生写事务时, 会把整个路径的对于page的修改写到新的page里,那些old page当没有读事务关联时, 就会有freelist回收再利用, 读事务时间不能太长, 不然会用太多的old page在内存, meta page有两个, 当初始化事务时, 会关联txid最大且有效的, 当当写事务要写会到page时, 会写到txid较小的那个, 及时写时失败, 也总有一个有效的meta page, 以此保证读事务总是可以在任何时候读到最新的commit数。, 写事务是相互阻塞的, 同时只有一个写事务存在, 这样对于事务的维护非常简单, 但是写事务的性能不高。 由于数据的存储依赖mmap, 当数据足够大时,由于os的换页操作, 读性能也会严重下降。