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
264 每月下载量
在 4 crates 中使用
42KB
975 行
db-rs
Rustaceans的舒适、嵌入式、单线程数据库。
优势
- 在Rust中定义模式。
- 只要你的类型实现了
Serialize
和Deserialize
,你就可以在数据库中使用 你的 类型。你不需要在将你的数据转换为数据库特定类型上费心。 - 所有数据库交互都是类型安全的。当你输入
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>>
的人来说的特殊化。它们存在的原因是在对 Vec
或 HashSet
进行小修改时能提供更好的日志性能(参见 lookup_list::LogEntry 或 lookup_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