#key-value-database #performance #data-store #database #data-storage

graus-db

高性能、线程安全的关键字值嵌入式数据存储

1个不稳定版本

0.1.0 2023年11月25日

#870 in 数据结构

MIT/Apache

29KB
465

GrausDb

Rust License

GrausDb 是一个用 Rust 编写的高性能、线程安全的关键字值嵌入式数据存储。它旨在实现简单性、效率和可靠性。

特性

  • 无锁并发: GrausDb 利用无锁数据结构以实现高性能并发访问。
  • 持久性: 数据持久化到磁盘,以确保数据的持久性。
  • 基于日志的存储: 键值对存储在日志文件中。
  • 基准测试: 包含基准测试以评估性能。

安装

要在 Rust 项目中使用 GrausDb,只需将其添加到您的 Cargo.toml 文件中的依赖项即可

[dependencies]
graus_db = "0.1.0"

快速入门

以下是一个如何在 Rust 应用程序中使用 GrausDb 的快速示例

let store = GrausDb::open("path")?;

store.set("key".to_owned(), "value".to_owned())?;

let val = store.get("key".to_owned())?;

它也可以从多个线程中调用

let store = GrausDb::open("path")?;

// Calls set method from 8 different threads
for i in 0..8 {
    let store = store.clone();
    thread::spawn(move || {
        store.set(format!("key{}", i), format!("value{}", i)).unwrap();
    });
}

API

GrausDb 提供了一个简单直观的 API,用于与键值存储进行交互。以下是一些 GrausDb 暴露的 key 函数和方法以及使用示例。

GrausDb::open

open 用于打开 GrausDb 实例,如果指定的路径不存在,则创建新的数据库。

示例

use graus_db::{GrausDb, Result};

fn main() -> Result<()> {
    let store = GrausDb::open("my_database")?;
    // Your database is now ready to use.
    Ok(())
}

set

set 方法用于在数据库中存储键值对。

示例

use graus_db::{GrausDb, Result};

fn main() -> Result<()> {
    let store = GrausDb::open("my_database")?;
    store.set("key".to_owned(), "value".to_owned())?;
    // Key "key" now has the value "value" in the database.
    Ok(())
}

get

get 方法检索与给定键关联的值。

示例

use graus_db::{GrausDb, Result};

fn main() -> Result<()> {
    let store = GrausDb::open("my_database")?;
    store.set("key".to_owned(), "value".to_owned())?;
    
    if let Some(value) = store.get("key".to_owned())? {
        println!("Value: {}", value); // Outputs: "Value: value"
    } else {
        println!("Key not found");
    }
    Ok(())
}

remove

remove 方法从数据库中删除键及其相关联的值。

示例

use graus_db::{GrausDb, Result};

fn main() -> Result<()> {
    let store = GrausDb::open("my_database")?;
    store.set("key".to_owned(), "value".to_owned())?;
    store.remove("key".to_owned())?;
    // Key "key" and its value are now removed from the database.
    Ok(())
}

update_if

update_if 方法原子地更新现有键的值,允许您提供自定义更新函数。

可以传递一个可选的谓词,只有当谓词满足时,值才会更新。

示例

use graus_db::{GrausDb, Result};

fn main() -> Result<()> {
    let key = ¨key1¨;
    store.set(key.to_owned(), "25".to_owned()).unwrap();

    let update_fn = |value: String| {
        let num = value.parse::<i32>().unwrap();
        (num - 1).to_string()
        };
    let predicate = |value: String| {
        let num = value.parse::<i32>().unwrap();
        num > 0
    };

    let result = store.update_if(
            key.to_owned(),
            update_fn,
            Some(key.to_owned()),
            Some(predicate),
    );
    // Key "key1" now has the value "24" in the database.
    // The function was applied because the predicate was met (25 > 0)
}

有关如何使用 GrausDb 的更多详细信息,请参阅测试。

架构和实现

GrausDb 的架构基于基于日志的存储和无锁并发原则

  • 基于日志的存储:GrausDb 将键值对存储在日志文件中。日志文件以单调递增的生成编号和日志扩展名命名。这种设计确保数据持久地存储到磁盘。

  • 无锁并发:GrausDb 使用无锁数据结构来提供对数据的高性能并发访问。这使多个线程能够有效地与数据库交互。

  • 内存索引:GrausDb维护一个内存索引,将键映射到日志中的位置。这个索引允许快速查找和高效的数据检索。

  • 压缩:为了保持高效的存储并减少磁盘空间使用,当达到阈值时,GrausDb会进行压缩。压缩涉及重写日志文件、删除过时数据并回收磁盘空间。

基准测试

GrausDb包含内置的基准测试工具,以评估其效率并帮助您做出数据驱动决策。

未来开发

下一个功能

  • 多线程基准测试
  • 范围获取
  • 同步API(日志)
  • 内部线程池 + futures

许可证

GrausDb遵循MIT许可证。

用GrausDb愉快地编码!

联系方式

GrausDb由Ricardo Pallas创建和维护。

网站: https://rpallas92.github.io/

依赖关系

~1.1–2.1MB
~43K SLoC