boltdb的实现和改进

 

整个代码不是很复杂,可以从代码中理解如何实现。

特点:btree,很小巧,但实现了完整事务机制,稳定,即使丢电也不会导致数据库错误。

 

整个结构如下:

meta page (前两页) --- > freelist page (第三页)
                  |
                  -----> bucket page (属于leaf page 开始是第4页) -> branch page -> leaf page
                                 |
                                 ---------> inline page(放在bucket page上) 

 

事务:

修改会产生镜像页,在写入的时候,先写所有镜像页,然后再写指向镜像页的meta page,如果镜像页没写完,程序就崩溃了,不影响之前的数据,因为meta page没有指向镜像页,如果meta page只写了一半,那么可以用checkSum检查出来,meta page双备份。

如果事务未提交,meta page不会指向镜像页,也就不会读到事务中的数据。

 

问题:

没做repetable_read级别的事务实现,直接serialize级别的,不允许同时写(但允许写时读),所以导致写入慢。

默认每次写都刷盘,大大拉低速度。这个可以调。

内存占用随着数据变得太大,这个我觉得是代码本身的问题,太多的东西序列化到了内存,这部分的代码也写得不好,太晦涩,难改。

 

改进的方法?:

增加一个持久层(线性写入)和内存层(用于查询,未写入boltdb之前写入内存),提升并发,然后再批量写入boltdb。

 

posted on 2017-12-09 16:02  dearplain  阅读(2020)  评论(2编辑  收藏  举报