过去一年多的时间里,阅读了 goim、blotDB、levelDB的源码,在这学习过程中,见识了大神们有趣的代码设计及效率优化的点。在这里仅做一些小结。以此结束源码阅读的时光。
读效率保证:
1.有序,保证有序,可以通过二分法查找,查找 key 可以将时间复杂度降至 O(long2N),同时有利于范围查找 。
2.高效的数据结构,如 B+ 数,平衡树,跳跃表等
3.多级索引,通过层层索引,不断缩小数据范围,避免线性查找。索引本身的数据量小,可以直接存储到内存中(level DB)。
写效率保证:
1.数据先写入缓存,然后批量写入文件。
2.建立缓存池,当需要缓存时,从缓存池中获取,用完之后再放回缓存池。避免内存频繁的申请释放。
3.自己申请一块大内存,然后拆分成多个小内存使用,减少小内存申请的次数。
4.对 key value 只做追加,不修改原值。
写入可靠性的保障
1.WAL 顺序写来保证写的效率,并通过该文件来做崩溃恢复,该方式可以有效的保证写的效率(levelDB)。
2.版本元数据写入。通过将决定数据取值的元素写入磁盘(blotDB实现),来决定是否写入成功。读数据时,通过元数据来定位读取数据的指向。
锁效率保证:
1.在高并发的情况下,尽可能拆分锁粒度,减少锁的争用(goim)。