3 个不稳定版本
0.2.1 | 2024年4月27日 |
---|---|
0.2.0 | 2024年4月27日 |
0.1.5 | 2024年4月25日 |
271 在 数据库实现 中
每月250 次下载
265KB
7K SLoC
SkipDB
简介
一个嵌入式、内存中、零拷贝、MVCC、几乎无锁和可序列化快照隔离的数据库引擎。
skipdb
的 SSI(可序列化快照隔离)事务模型参考了 foundationdb
的论文 和 badger
。
对于异步使用,请参阅 async-skipdb
。
此包包含两种内存键值数据库
-
SerializableDb
支持并发执行可序列化快照隔离事务和乐观并发控制事务。
通过
SerializableDb::serializable_write
创建的事务可以正确处理所有类型的写偏斜。通过
SerializableDb::optimistic_write
创建的事务可以处理所有类型的直接依赖写偏斜,但不能处理所有类型的间接依赖写偏斜,例如 https://wiki.postgresql.ac.cn/wiki/SSI#Intersecting_Data。 -
OptimisticDb
仅支持乐观并发控制的并发执行,这意味着写事务无法检测所有类型的写偏斜。
可以正确处理所有类型的直接依赖写偏斜,但不能处理所有类型的间接依赖写偏斜,例如 https://wiki.postgresql.ac.cn/wiki/SSI#Intersecting_Data。
特性
- 原子性、一致性、隔离性、MVCC、并发安全和几乎无锁。
- 没有额外的分配和复制,数据库中存储的键和值没有
Arc
包装器,这意味着用户提供K
和V
,数据库直接存储K
和V
。 - 零拷贝和原地压缩,这意味着在压缩时没有复制,没有额外的分配。
- 事务的并发执行,提供可序列化快照隔离,避免写偏斜。
- 读取事务和写入事务都是
Send + Sync + 'static
,这意味着您再也不需要处理烦人的生命周期问题。 - 无锁且线程安全的读取事务:读取事务完全线程安全,可以在多个线程中共享,读取事务中没有锁。
BTreeMap
类型的用户友好 API,以及所有迭代器都实现了Iterator
特性,这意味着用户在遍历数据库时可以使用 Rust 强大的组合器。- 100% 安全,设置了
[forbid(unsafe_code)]
。
安装
[dependencies]
skipdb = "0.2"
示例
use skipdb::serializable::SerializableDb;
#[derive(Debug)]
struct Person {
name: String,
hobby: String,
age: u8,
}
fn main() {
let db: SerializableDb<u64, Person> = SerializableDb::new();
{
let alice = Person { name: "Alice".to_string(), hobby: "swim".to_string(), age: 20 };
let bob = Person { name: "Bob".to_string(), hobby: "run".to_string(), age: 30 };
let mut txn = db.serializable_write();
txn.insert(1, alice).unwrap();
txn.insert(2, bob).unwrap();
{
let alice = txn.get(&1).unwrap().unwrap();
assert_eq!(alice.value().name, "Alice");
assert_eq!(alice.value().age, 20);
assert_eq!(alice.value().hobby, "swim");
}
txn.commit().unwrap();
}
{
let txn = db.read();
let alice = txn.get(&1).unwrap();
assert_eq!(alice.value().name, "Alice");
assert_eq!(alice.value().age, 20);
assert_eq!(alice.value().hobby, "swim");
let bob = txn.get(&2).unwrap();
assert_eq!(bob.value().name, "Bob");
assert_eq!(bob.value().age, 30);
assert_eq!(bob.value().hobby, "run");
}
}
许可证
skipdb
受 MIT 许可证和 Apache 许可证(版本 2.0)的双重许可。
请参阅 LICENSE-APACHE,LICENSE-MIT 以获取详细信息。
版权所有 (c) 2024 Al Liu。
依赖项
~2.8–8.5MB
~68K SLoC