1个不稳定版本
使用旧的Rust 2015
0.15.4 | 2018年2月12日 |
---|
#305 在 数据库实现
355KB
8K SLoC
sled喜欢吃数据!它还是预览版
一个预览版现代嵌入式数据库。
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优化的日志结构化存储
目标
- 不要让用户思考。界面应该是直观的。
- 不要让用户意外遇到性能陷阱。
- 不要打扰操作员。将学术中的可靠性技术应用于实际操作。
- 不要浪费太多电力。我们的数据结构应该发挥现代硬件的优势。
计划
- 在读取方面击败LSM树,在写入方面使用传统的B+树
- 通过高级的
Db
版本化键接口提供MVCC、事务、合并操作符和快照 - 提供类似RocksDB的定制合并操作符
- 形成可线性存储和灵活的定位无关存储的钢铁核心
- 支持SQLite、MySQL、Postgres后端插件
- 向前兼容的二进制格式
- 动态学习/概率索引支持
- 支持其他语言的绑定
警告
- 相当年轻,目前应视为不稳定
- C API可能会迅速改变
- 在1.0.0.0版本发布之前,磁盘格式将会以非向前兼容的方式改变!之后,我们将始终支持向前迁移。
- 尚未得到很多性能调优的关注,它具有极高的理论性能,但需要一些调优才能达到。目前,混合工作负载下每秒约200k操作,小键只读工作负载下每秒约700万。这将很快得到显著改善!
欢迎贡献!
想帮助推动开源嵌入式数据库的发展吗?请查看CONTRIBUTING.md!
架构
在锁免费的日志上,在锁免费的页缓存上,有一个锁免费的树。页缓存将部分页面片段分散到日志中,而不是像历史上一致的B+树那样一次重写整个页面。在页面读取时,我们并发地在日志中进行散列收集读取,以从其片段中实例化页面。
参考文献
依赖关系
~1.2–2MB
~41K SLoC