21个版本

0.3.2 2024年8月6日
0.3.1 2024年5月21日
0.2.1 2023年6月29日
0.1.18 2023年3月27日
0.1.16 2023年2月18日

#79 in #type-safe

Download history 245/week @ 2024-05-19 2/week @ 2024-05-26 1/week @ 2024-06-02 3/week @ 2024-06-09 5/week @ 2024-06-16 31/week @ 2024-06-30 1/week @ 2024-07-07 5/week @ 2024-07-14 89/week @ 2024-07-28 138/week @ 2024-08-04 14/week @ 2024-08-11

每月242次下载
2 crate 中使用

BSD-3-Clause

8KB
68

db-rs

Rustaceans的舒适、嵌入式、单线程数据库。

优点

  • 在Rust中定义模式。
  • 只要它们实现 SerializeDeserialize,就可以在数据库中使用您的类型。您不必费心将数据转换为数据库特定的类型。
  • 所有数据库交互都是类型安全的。当您键入 db. 时,您的工具将建议一个您表格的列表。当您选择一个表格时,您将看到一个填充了您类型的表格类型合同。无需手动编写类型安全的合同来包装您的数据库。
  • 支持多种简单的数据结构,包括LookupTables、Lists等。实现您自己的表格类型是微不足道的。
  • 所有表格变异都使用您类型的快速、紧凑的bincode表示形式持久化到只追加日志中。
  • 您可以使用 begin_transaction() 表达对多个表格的原子更新。

快速入门

将以下内容添加到您的 Cargo.toml

db-rs = "0.3.1"
db-rs-derive = "0.3.1"

定义您的模式

use db_rs_derive::Schema;
use db_rs::{Single, List, LookupTable};

#[derive(Schema)]
struct SchemaV1 {
    owner: Single<Username>,
    admins: List<Username>,
    users: LookupTable<Username, Account>,
}

初始化您的数据库

use db_rs::Db;
use db_rs::Config;

let mut db = SchemaV1::init(Config::in_folder("/tmp/test/"))?;
db.owner.insert("Parth".to_string())?;

println!("{}", db.owner.data().unwrap());

表格类型

每个表格都有一个内存表示形式和相应的日志条目格式。例如[List]的内存格式是[Vec],您可以通过查看它的对应 list::LogEntry 来了解写入磁盘的方式。

Lookup开头的表格在它们的内存格式中包含一个HashMap。[LookupTable]是最一般的形式,而[LookupList]和[LookupSet]是针对希望使用HashMap<K, Vec<V>>HashMap<K, HashSet<V>>的人的特殊化。它们存在的原因是在对特定的VecHashSet进行小修改时提供更好的日志性能(请参阅lookup_list::LogEntrylookup_set::LogEntry)。

日志压缩

在任何时刻,您都可以在数据库上调用 Db::compact_log。这将原子地写入所有当前表的紧凑表示。例如,如果LookupTable中的一个键被多次写入,紧凑表示将只包含最后一个值。每种表类型都有自己定义的紧凑表示。

如果您的数据库在 Arc<Mutex>> 中,您还可以使用 [BackgroundCompacter],它将在单独的线程中定期执行压缩。

事务和批量写入

您可以使用 Db::begin_transaction 来开始事务,这将允许您表达可以被当作一组丢弃的批量操作,如果程序被中断。目前还没有取消事务的方法。事务也是批量写入的机制,日志条目在事务完成前保存在内存中,并一次性写入磁盘。

研究和思考的活跃领域

  • 由于数据库实现(如redis)是单线程的,这迫使我们通过低延迟而不是并发来通过应用吞吐量。目前,这符合我们的需求。仅仅嵌入式就比像Postgres这样的东西提供了更多的吞吐量。在服务器式设置中使用时,请将数据库放在 Arc<Mutex<>> 中。
  • 数据库目前没有提供工具来定义完整性约束,除了Rust类型系统隐式强制执行的约束之外(例如非空)。对我们来说,这仅仅是一个应用程序方面的关注点。

功能

clone - 在所有表类型上派生克隆。克隆数据库之间的一致性没有提供。在测试情况下很有用。

使用于

许可证:BSD-3-Clause

依赖项

~1.6–2.2MB
~50K SLoC