A pre-alpha modern embedded database.
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);
- ordered map API
- fully atomic single-key operations, supports CAS
- zstd compression (use the zstd build feature)
- cpu-scalable lock-free implementation
- SSD-optimized log-structured storage
- don't make the user think. the interface should be obvious.
- don't surprise users with performance traps.
- don't wake up operators. bring reliability techniques from academia into real-world practice.
- don't use so much electricity. our data structures should play to modern hardware's strengths.
- beat LSM trees for reads and traditional B+ trees for writes
- MVCC, transactions, merge operators and snapshots provided via a higher-level
Db
versioned-key interface - custom merge operators a la RocksDB
- form the iron core of a linearizable store and a flexible location-agnostic store
- SQLite, MySQL, Postgres back-end plugin support
- forward-compatible binary format
- dynamic learned/probabilistic index support
- bindings for other languages
- quite young, should be considered unstable for the time being
- the C API is likely to change rapidly
- the on-disk format is going to change in non-forward compatible ways
before the
1.0.0
release! after that, we will always support forward migrations. - has not yet received much attention for performance tuning, it has an extremely high theoretical performance but there is a bit of tuning to get there. currently only around 200k operations per second with mixed workloads, and 7 million/s for read-only workloads on tiny keys. this will be improving dramatically soon!
want to help advance the state of the art in open source embedded databases? check out CONTRIBUTING.md!
lock-free tree on a lock-free pagecache on a lock-free log. the pagecache scatters partial page fragments across the log, rather than rewriting entire pages at a time as B+ trees for spinning disks historically have. on page reads, we concurrently scatter-gather reads across the log to materialize the page from its fragments.