写点什么

使用 rust 实现的持久 kv 存储

作者:杨光跃
  • 2022 年 10 月 11 日
    浙江
  • 本文字数:492 字

    阅读完需:约 2 分钟

git 地址:https://github.com/auyang-0626/learn-db


learn-db

使用 rust 实现的基于 Bitcask 引擎 的 kv 数据库。

索引篇

为了快速查找,所有的索引数据都是放在内存中,可以简单的理解为 HashMap.

不过为了能够并发的查询和写入,所以实现了分段锁(数组+链表);

另外,数据库运行的过程中,索引数量会不断的增减,所以也实现了动态扩缩容的能力。

具体实现:src/index/dynamic_index.rs

存储篇

写入实现

因为整个系统只有一个写入点,并且需要支持多线程写入, 很自然的想到了 多生产者+单消费者的队列模型。

为了提高性能,消费者可以获取多条数据,批量写入; 生产过程本身是异步的,如果有同步的需求,可以阻塞等待完成的回执。

具体实现:src/store/write_consumer.rs

读取实现

基于索引,可以定位到数据所在的文件以及偏移量, 所以读取就是简单的打开文件,设置偏移量,读取指定大小数据。

不过每次都打开文件比较浪费,所以可以把文件描述符池化。

具体实现:src/store/mod.rs:72

恢复与快照

系统运行过程中,会异步生成索引文件,启动时只需要把索引文件加载到内存就可以了;

同时,根据配置,一些比较老的数据文件,也会被回收掉,这样可以避免数据文件越来越多;

用户头像

杨光跃

关注

还未添加个人签名 2019.04.20 加入

还未添加个人简介

评论

发布
暂无评论
使用rust实现的持久kv存储_rust_杨光跃_InfoQ写作社区