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次下载
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