#lock-free #嵌入式数据库 #持久化 #数据库 #并发 #嵌入式

索引

一种快速响应的持久化无锁B+树

1个不稳定版本

使用旧的Rust 2015

0.15.4 2018年2月12日

#305数据库实现

MIT/Apache

355KB
8K SLoC

sled喜欢吃数据!它还是预览版

Build Status documentation

一个预览版现代嵌入式数据库。

extern crate sled;

use sled::{ConfigBuilder, Tree};

let config = ConfigBuilder::new()
  .path(path)
  .build();

let tree = Tree::start(config).unwrap();

// set and get
tree.set(k, v1);
assert_eq!(tree.get(&k), Ok(Some(v1)));

// compare and swap
tree.cas(k, Some(v1), Some(v2));

// scan forward
let mut iter = tree.scan(k);
assert_eq!(iter.next(), Some(Ok((k, v2))));
assert_eq!(iter.next(), None);

// deletion
tree.del(&k);

特性

  • 有序映射API
  • 完全原子化的单个键操作,支持CAS
  • zstd压缩(使用zstd构建功能)
  • 可扩展的锁免费用实现
  • 针对SSD优化的日志结构化存储

目标

  1. 不要让用户思考。界面应该是直观的。
  2. 不要让用户意外遇到性能陷阱。
  3. 不要打扰操作员。将学术中的可靠性技术应用于实际操作。
  4. 不要浪费太多电力。我们的数据结构应该发挥现代硬件的优势。

计划

  • 在读取方面击败LSM树,在写入方面使用传统的B+树
  • 通过高级的Db版本化键接口提供MVCC、事务、合并操作符和快照
  • 提供类似RocksDB的定制合并操作符
  • 形成可线性存储灵活的定位无关存储的钢铁核心
  • 支持SQLite、MySQL、Postgres后端插件
  • 向前兼容的二进制格式
  • 动态学习/概率索引支持
  • 支持其他语言的绑定

警告

  • 相当年轻,目前应视为不稳定
  • C API可能会迅速改变
  • 在1.0.0.0版本发布之前,磁盘格式将会以非向前兼容的方式改变!之后,我们将始终支持向前迁移。
  • 尚未得到很多性能调优的关注,它具有极高的理论性能,但需要一些调优才能达到。目前,混合工作负载下每秒约200k操作,小键只读工作负载下每秒约700万。这将很快得到显著改善!

欢迎贡献!

想帮助推动开源嵌入式数据库的发展吗?请查看CONTRIBUTING.md

架构

在锁免费的日志上,在锁免费的页缓存上,有一个锁免费的树。页缓存将部分页面片段分散到日志中,而不是像历史上一致的B+树那样一次重写整个页面。在页面读取时,我们并发地在日志中进行散列收集读取,以从其片段中实例化页面。

参考文献

依赖关系

~1.2–2MB
~41K SLoC