使用rust实现的基于 Bitcask 引擎 的kv数据库。
为了快速查找,所有的索引数据都是放在内存中,可以简单的理解为 HashMap.
不过为了能够并发的查询和写入,所以实现了分段锁(数组+链表);
另外,数据库运行的过程中,索引数量会不断的增减,所以也实现了动态扩缩容的能力。
具体实现:src/index/dynamic_index.rs
因为整个系统只有一个写入点,并且需要支持多线程写入, 很自然的想到了 多生产者+单消费者的队列模型。
为了提高性能,消费者可以获取多条数据,批量写入; 生产过程本身是异步的,如果有同步的需求,可以阻塞等待完成的回执。
具体实现:src/store/write_consumer.rs
基于索引,可以定位到数据所在的文件以及偏移量, 所以读取就是简单的打开文件,设置偏移量,读取指定大小数据。
不过每次都打开文件比较浪费,所以可以把文件描述符池化。
具体实现:src/store/mod.rs:72
系统运行过程中,会异步生成索引文件,启动时只需要把索引文件加载到内存就可以了;
同时,根据配置,一些比较老的数据文件,也会被回收掉,这样可以避免数据文件越来越多;