23个版本

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.0 2023年1月13日

#2#transactional

Download history 256/week @ 2024-05-20 8/week @ 2024-05-27 13/week @ 2024-06-03 10/week @ 2024-06-10 2/week @ 2024-06-17 2/week @ 2024-06-24 23/week @ 2024-07-01 8/week @ 2024-07-08 11/week @ 2024-07-15 109/week @ 2024-07-29 143/week @ 2024-08-05

264 每月下载量
4 crates 中使用

BSD-3-Clause

42KB
975

db-rs

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

优势

  • 在Rust中定义模式。
  • 只要你的类型实现了 SerializeDeserialize,你就可以在数据库中使用 你的 类型。你不需要在将你的数据转换为数据库特定类型上费心。
  • 所有数据库交互都是类型安全的。当你输入 db. 时,你的工具将建议一个你的表列表。当你选择一个表时,你将看到一个填充了你的类型的该表类型的合同。不需要将你的db包裹在手工编写的类型安全合同中。
  • 支持多种简单的数据结构,包括查找表、列表等。实现你自己的表类型是微不足道的。
  • 所有表更新都持久化到使用你类型的快速 & 紧凑的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 开始事务,这将允许您表达可以丢弃的批量操作,如果您的程序被中断。目前还没有方法可以中止事务。事务也是批量写入的一种机制,日志条目在事务完成之前保存在内存中,然后一次性写入磁盘。

研究的活跃领域

  • 由于 db 实现(如 redis)是单线程的,这迫使您通过低延迟而不是并发性来实现应用程序吞吐量。目前,这符合我们的需求。简单地嵌入给我们的吞吐量比类似 Postgres 的东西多得多。在服务器式环境中使用时,请将数据库放在 Arc<Mutex<>> 中。
  • 数据库目前没有提供工具来定义完整性约束,超出 Rust 类型系统隐式施加的约束(例如非空)。对我们来说,这目前只是应用方面的关注。

特性

clone - 在所有表类型上推导出 clone。不提供克隆数据库的一致性。在测试情况下很有用。

被使用

许可证:BSD-3-Clause

依赖关系

~0.6–1.4MB
~30K SLoC