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
41KB
991 代码行
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