#数据库引擎 #键值存储 #嵌入式数据库 #数据库 #原子性 #memdb #memodb

skipdb

一个嵌入式、内存中、零拷贝、原子性、一致性、MVCC、几乎无锁和可序列化快照隔离的数据库引擎

3 个不稳定版本

0.2.1 2024年4月27日
0.2.0 2024年4月27日
0.1.5 2024年4月25日

271数据库实现

Download history • Rust 包仓库 414/week @ 2024-04-25 • Rust 包仓库 11/week @ 2024-05-02 • Rust 包仓库 2/week @ 2024-05-30 • Rust 包仓库 5/week @ 2024-06-20 • Rust 包仓库 31/week @ 2024-06-27 • Rust 包仓库 12/week @ 2024-07-04 • Rust 包仓库

每月250 次下载

MIT/Apache

265KB
7K SLoC

SkipDB

一个嵌入式、内存中、零拷贝、原子性、一致性、MVCC、几乎无锁和可序列化快照隔离的数据库引擎。

github Build codecov license

LoC docs.rs crates.io crates.io

英文 | 简体中文

简介

一个嵌入式、内存中、零拷贝、MVCC、几乎无锁和可序列化快照隔离的数据库引擎。

skipdb 的 SSI(可序列化快照隔离)事务模型参考了 foundationdb 的论文badger

对于异步使用,请参阅 async-skipdb

此包包含两种内存键值数据库

  1. SerializableDb

    支持并发执行可序列化快照隔离事务和乐观并发控制事务。

    通过 SerializableDb::serializable_write 创建的事务可以正确处理所有类型的写偏斜。

    通过 SerializableDb::optimistic_write 创建的事务可以处理所有类型的直接依赖写偏斜,但不能处理所有类型的间接依赖写偏斜,例如 https://wiki.postgresql.ac.cn/wiki/SSI#Intersecting_Data

  2. OptimisticDb

    仅支持乐观并发控制的并发执行,这意味着写事务无法检测所有类型的写偏斜。

    可以正确处理所有类型的直接依赖写偏斜,但不能处理所有类型的间接依赖写偏斜,例如 https://wiki.postgresql.ac.cn/wiki/SSI#Intersecting_Data

特性

  • 原子性、一致性、隔离性、MVCC、并发安全和几乎无锁。
  • 没有额外的分配和复制,数据库中存储的键和值没有 Arc 包装器,这意味着用户提供 KV,数据库直接存储 KV
  • 零拷贝和原地压缩,这意味着在压缩时没有复制,没有额外的分配。
  • 事务的并发执行,提供可序列化快照隔离,避免写偏斜。
  • 读取事务和写入事务都是 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-APACHELICENSE-MIT 以获取详细信息。

版权所有 (c) 2024 Al Liu。

依赖项

~2.8–8.5MB
~68K SLoC