Learn how to use the FlowDB LSM engine: open, write, read, query, delete, flush, compact, and shut down.
Add flowdb to your Cargo.toml:
[dependencies]
flowdb = "0.6"
tempfile = "3" # for temp directories in examplesuse flowdb::{Config, Engine};
let config = Config {
data_dir: "./my_data".into(),
auto_background: true, // auto flush/compact/GC
..Default::default()
};
let engine = Engine::open(config).unwrap();create_if_missing: true(default) creates the directory if absent.auto_background: truespawns an OS thread for periodic flush, compaction, and GC.
Records have a key (binary), ts (microsecond timestamp), expire_at, and value (binary):
use flowdb::Record;
let records = vec![
Record::new("sensor:temp", 1_700_000_000_000_000, b"22.5".to_vec()),
Record::new("sensor:hum", 1_700_000_000_001_000, b"60%".to_vec()),
];
engine.write_batch_owned(records).unwrap();write_batch_ownedtakesVec<Record>(owned).write_batchtakes&[Record](borrowed).write_batch_syncis similar but bypasses the background writer.
let rec = engine.get("sensor:temp", 1_700_000_000_000_000).unwrap();
match rec {
Some(r) => println!("value = {}", String::from_utf8_lossy(&r.value)),
None => println!("not found"),
}let latest = engine.get_latest("sensor:temp").unwrap();This returns the record with the highest ts across memtables and SSTs.
use flowdb::Query;
let results = engine.query(Query::prefix("sensor:")).unwrap();let results = engine.query(Query::key_range("sensor:a", "sensor:z")).unwrap();let results = engine.query(Query::time_range(start_ts, end_ts)).unwrap();let results = engine.query(Query::prefix_time_range("sensor:", start_ts, end_ts)).unwrap();For large datasets, use ScanIterator (implements Iterator<Item=Result<Record>>):
use flowdb::ScanRange;
let mut iter = engine.scan(ScanRange::prefix("sensor:")).unwrap();
while let Some(Ok(rec)) = iter.next() {
// process one record at a time — no full materialisation
}engine.delete_batch(&[("sensor:temp".into(), 1_700_000_000_000_000)]).unwrap();
engine.delete_range("sensor:old_a", "sensor:old_z").unwrap();engine.flush().unwrap(); // memtable → SST
engine.trigger_compaction().unwrap(); // merge SSTs
engine.trigger_gc().unwrap(); // purge expired SSTslet s = engine.stats();
println!("{} sstables, {} MB written", s.sstable_count, s.total_bytes_written / 1024 / 1024);engine.shutdown().unwrap();Run it:
cargo run --example basic_engine