6 个版本 (3 个破坏性更新)

0.4.0 2024 年 8 月 5 日
0.3.1 2024 年 7 月 30 日
0.2.0 2024 年 7 月 29 日
0.1.1 2024 年 7 月 25 日

#17数据库实现

Download history 153/week @ 2024-07-19 450/week @ 2024-07-26 159/week @ 2024-08-02 13/week @ 2024-08-09

每月 775 次下载

MIT/Apache

115KB
2K SLoC

image

🦁 buffdb 🦁

buffdb 是实验性软件。加入 buffdb 的 Discord 寻求帮助,并查看 尚未正常工作的功能。许多基本功能尚未确定。

这是用 Rust 编写的,基于 DuckDB 的 gRPC 持久层的早期实现。目标是抽象出与使用 protobufs 和 flattbuffers 相关的许多复杂性,以便移动用户可以快速访问。

如何运行

要运行服务器,您需要安装 Rust。然后,将仓库克隆后,您可以运行

cargo run --all-features -- run

这将启动服务器在 [::1]:50051,将键值对存储在 kv_store.db 中,将 blob 数据存储在 blob_store.db 中。这三个都可以通过命令行标志进行配置:分别使用 --addr--kv-store--blob-store

要启用优化进行构建,请运行 cargo build --all-features --release。生成的二进制文件将位于 target/release/buffdb。它是静态链接的,因此可以在文件系统中的任何位置移动而不会出现问题。

更愿意自己处理 gRPC 服务器?buffdb 也可以作为库使用!

Rust 中示例库的使用

运行 cargo add buffdb tonic tokio futures 以添加必要的依赖项。然后您可以执行以下代码,该代码位于 src/main.rs

use buffdb::backend::DuckDb;
use buffdb::kv::{Key, KeyValue, Value};
use tonic::{Request, IntoRequest};
use futures::{stream, StreamExt as _};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut client = buffdb::transitive::kv_client::<_, DuckDb>("kv_store.db").await?;
    client
        .set(stream::iter([KeyValue {
            key: "key_set".to_owned(),
            value: "value_set".to_owned(),
        }]))
        .await?
        .into_inner();

    let mut stream = client
        .get(stream::iter([Key {
            key: "key_get".to_owned(),
        }]))
        .await?
        .into_inner();
    let Value { value } = stream.next().await.unwrap()?;
    assert_eq!(value, "value_get");

    Ok(())
}

本项目受悉尼大学计算机科学学院实践教授迈克尔·卡希尔(Michael Cahill)的讨论启发。

命令行界面

您可以使用 buffdb help 来查看允许的命令和标志。目前支持以下操作

  • buffdb run [ADDR],启动服务器。默认地址为 [::1]:50051
  • buffdb kv get <KEY>,将值打印到标准输出。
  • buffdb kv set <KEY> <VALUE>,设置值。
  • buffdb kv delete <KEY>,删除值。
  • buffdb kv eq [KEYS]...,如果所有提供的键的值都相等,则成功退出。如果有任何两个值不相等,则退出时带有错误代码。
  • buffdb kv not-eq [KEYS]...,如果所有提供的键的值都是唯一的,则成功退出。如果有任何两个值相等,则退出时带有错误代码。
  • buffdb blob get <ID>,将数据打印到标准输出。注意,这是任意字节!
  • buffdb blob store <FILE> [METADATA],存储文件(使用 - 表示标准输入)并将 ID 打印到标准输出。元数据是可选的。
  • buffdb blob update <ID> data <FILE>,更新 blob 的数据。使用 - 表示标准输入。元数据保持不变。
  • buffdb blob update <ID> metadata [METADATA],更新 blob 的元数据。数据保持不变。省略 [METADATA] 将元数据设置为 null。
  • buffdb blob update <ID> all <FILE> [METADATA],更新 blob 的数据和元数据。对于 <FILE>,使用 - 表示标准输入。省略 [METADATA] 将元数据设置为 null。
  • buffdb blob delete <ID>,删除 blob。
  • buffdb blob eq-data [IDS]...,如果所有提供的ID的blob都相等,则成功退出。如果有任何两个blob不相等,则退出时带有错误代码。
  • buffdb blob not-eq-data [IDS]...,如果所有提供的ID的blob都是唯一的,则成功退出。如果有任何两个blob相等,则退出时带有错误代码。

修改存储的命令如果键/ID不存在,将退出时带有错误代码。一个例外是更新blob的元数据为null,因为它不需要事先存在。

所有kvblob的命令都可以使用-s/--store来指定要使用的存储。默认值分别是kv_store.dbblob_store.db。要选择后端,请使用-b/--backend。默认值取决于启用了哪些后端。

背景

我们的许多边缘客户在处理与低带宽和高性能相关的挑战时受到了这个项目的启发。我们希望我们能够构建一个有助于团队目标边缘计算环境的解决方案。

今天,buffdb的主要重点是速度:我们试图确保某种程度的持久性,为此我们付出了性能代价,但我们的目标是最终比任何其他嵌入式数据库都要快。

高级目标

  • 减少序列化/反序列化的开销。
  • 确保本地存储和网络通信之间的数据格式一致。
  • 提供比JSON或XML更快的读写操作。
  • 紧凑数据存储:ProtoBufs可以显著减少存储数据的大小。
  • 互操作性:应用程序的本地存储和后端系统之间的无缝集成。

用例

  • 离线数据访问:对于需要离线功能的应用程序(例如,记事本应用、游戏、现场工作、航空公司、协作文档等)。
  • 物联网:在同步到云服务器之前,在本地管理设备配置和状态。

依赖项

~27–40MB
~517K SLoC