#key-value #lsm #lsm-tree #blocking #in-memory #byte #super

bin+lib tiny-lsm

一个简单的内存阻塞 LSM 树,用于固定大小的键和值

16 个不稳定版本 (3 个重大变更)

0.4.6 2022年4月21日
0.4.5 2021年12月21日
0.3.1 2021年12月20日
0.2.4 2021年12月6日
0.1.4 2021年12月1日

#309 in 压缩

每月35次下载

GPL-3.0 许可证

42KB
891

tiny-lsm

非常简单的内存阻塞 LSM,用于固定大小的键和值。

尽管是单线程和阻塞的,但仍然能够超越许多其他存储系统。

当您

  • 希望将整个数据集放入内存时
  • 可以以有限字节数来模拟您的键和值

使用 fuzzcheck 进行测试,并且有意保持 API 和内部结构的简洁,以减少错误并提高性能。

zerocopy crate 极好地配合,可以将固定大小的字节数组视为类型数据,而无需支付昂贵的反序列化成本。


lib.rs:

tiny-lsm 是一个非常简单的内存 LSM,用于在更复杂的系统中管理固定大小的元数据。

使用 crc32fast 对日志和 sstables 中的所有键值对进行校验和。使用 zstd 压缩所有 sstables。在后台执行 sstable 压缩。

因为数据在内存中,因此不需要在 sstables 上放置 bloom 过滤器,并且读取操作不会因为 IO 问题而失败。

Lsm 实现 Deref<Target=BTreeMap<[u8; K], [u8; V]>> 以不可变方式直接访问数据,无需任何 IO 或阻塞。

Lsm::insert 将所有数据写入日志文件前面的 32-kb BufWriter,因此它将在很短的时间内阻塞。SST 压缩完全在后台处理。

如果您需要快速恢复时间,则对于大型数据集来说这是一个糟糕的选择,因为启动时需要读取所有 sstables 和写入前日志。

尽管是内存中的,但使用分层sstables的所有好处在于,它们可以作为有效的日志去重机制,将空间放大保持在非常低的水平。

最大吞吐量不是这个项目的目标。低空间放大和非常简单的代码才是目标,因为这是为了在更复杂的系统中维护元数据。

目前没有压缩节流。你可以通过调整与压缩相关的 Config 选项来改变压缩特性。

不要更改现有数据库中键或值的常量大小。

示例

// open up the LSM
let mut lsm = tiny_lsm::Lsm::recover("path/to/base/dir").expect("recover lsm");

// store some things
let key: [u8; 8] = 8_u64.to_le_bytes();
let value: [u8; 1] = 255_u8.to_le_bytes();
lsm.insert(key, value);

assert_eq!(lsm.get(&key), Some(&value));

依赖关系

约3MB
约56K SLoC