4 个版本

0.1.6 2022年1月13日
0.1.5 2021年6月25日
0.1.4 2020年10月15日
0.1.3 2019年12月25日

#831数据库接口

23 每月下载量
用于 2 crates

LGPL-3.0

41KB
991 代码行

Build Status

FlumeDB

Sunrise Choir 的 Flume 是将 JavaScript flumedb 重写成 Rust,具有新的架构以提高性能和灵活性。

架构

Flume 是一个模块化数据库

  • 我们的主要真相来源是一个仅追加的只写日志:它提供了持久存储
  • 我们的二级派生真相是日志的视图:它们专注于回答有关数据的问题
    • 每个视图通过仅追加日志的只读副本接收数据
    • 每个视图都可以构建自己的模型来表示数据,无论是回指主真相来源(规范化)还是将数据实体化(反规范化)
    • 每个视图创建一个针对它们提供的查询优化了的结构,它们不需要是持久的,因为它们可以从主日志中重建

在 flume 中,每个视图都记住一个版本号,如果版本号发生变化,它将重新构建视图。这意味着视图代码可以轻松更新,或者添加新视图。它只是在启动时重新构建视图。

示例

use flumedb::Error;
use flumedb::OffsetLog;

fn main() -> Result<(), Error> {
    let path = shellexpand::tilde("~/.ssb/flume/log.offset");
    let log = OffsetLog::<u32>::open_read_only(path.as_ref())?;

    // Read the entry at offset 0
    let r = log.read(0)?;
    // `r.data` is a json string in a standard ssb log.
    // `r.next` is the offset of the next entry.
    let r = log.read(r.next);

    log.iter()
    .map(|e| serde_json::from_slice::<serde_json::Value>(&e.data).unwrap())
    .for_each(|v| println!("{}", serde_json::to_string_pretty(&v).unwrap()));

    Ok(())
}

依赖项

~7–17MB
~204K SLoC