kv-rs
is a key-value pairs to an append-only log file,
and keeps a mapping of keys to file positions in memory.
All live keys must fit in memory.
Deletes write a tombstone value to the log file.
To remove old garbage, logs can be compacted by writing new logs containing only live
data, skipping replaced values and tombstones.
Getting started
use std::path::PathBuf;
use kv_rs::error::Error;
use kv_rs::storage::engine::Engine;
use kv_rs::storage::log_cask::LogCask;
fn main() {
println!("Hello, kv CLI!");
run().unwrap();
println!("Bye~");
}
fn run() -> Result<(), Error> {
let storage_path = PathBuf::new().join("D:/workspace/kv/storage/kvdb");
let mut engine = LogCask::new(storage_path)?;
engine.set(b"b", vec![0x01])?;
engine.set(b"b", vec![0x02])?;
engine.set(b"e", vec![0x05])?;
engine.delete(b"e")?;
engine.set(b"c", vec![0x00])?;
engine.delete(b"c")?;
engine.set(b"c", vec![0x03])?;
engine.set(b"", vec![])?;
engine.set(b"a", vec![0x01])?;
engine.delete(b"f")?;
engine.delete(b"d")?;
engine.set(b"d", vec![0x04])?;
assert_eq!(
vec![
(b"".to_vec(), vec![]),
(b"a".to_vec(), vec![0x01]),
(b"b".to_vec(), vec![0x02]),
(b"c".to_vec(), vec![0x03]),
(b"d".to_vec(), vec![0x04]),
],
engine.scan(..).collect::<Result<Vec<_>,Error>> ()?,
);
let rs = engine.flush();
Ok(())
}