# redb

[](https://crates.io/crates/redb)
[](https://docs.rs/redb)
[](https://crates.io/crates/redb)
[](https://deps.rs/repo/github/cberner/redb)
A simple, portable, high-performance, ACID, embedded key-value store.
redb is written in pure Rust and is loosely inspired by [lmdb](http://www.lmdb.tech/doc/). Data is stored in a collection
of copy-on-write B+trees. For more details, see the [design doc](docs/design.md)
```rust
use redb::{Database, Error, ReadableDatabase, TableDefinition};
const TABLE: TableDefinition<&str, u64> = TableDefinition::new("my_data");
fn main() -> Result<(), Error> {
let db = Database::create("my_db.redb")?;
let write_txn = db.begin_write()?;
{
let mut table = write_txn.open_table(TABLE)?;
table.insert("my_key", &123)?;
}
write_txn.commit()?;
let read_txn = db.begin_read()?;
let table = read_txn.open_table(TABLE)?;
assert_eq!(table.get("my_key")?.unwrap().value(), 123);
Ok(())
}
```
## Status
Stable and maintained.
The file format is stable, and a reasonable effort will be made to provide an upgrade path if there
are any future changes to it.
## Features
* Zero-copy, thread-safe, `BTreeMap` based API
* Fully ACID-compliant transactions
* MVCC support for concurrent readers & writer, without blocking
* Crash-safe by default
* Savepoints and rollbacks
## `no_std`
Turning off the `std` feature, with `experimental-api-5` on, builds redb without the standard
library. It needs `alloc`, `panic = "abort"`, and a target with atomic compare-and-swap -- Cortex-M3
and above, but not Cortex-M0. There is no filesystem, so storage is supplied by implementing
`StorageBackend` and passing it to `Builder::create_with_backend()`. The `cache_metrics`,
`chrono_v0_4` and `uuid` features are unavailable.
## Development
[`just`](https://github.com/casey/just) and rootless
[`podman`](https://podman.io/) are required.
Toolchain setup, dependency vendoring, and `cargo-deny` checks may use network access without
compiling project dependencies. Other development recipes continue to run on
the host. Cargo build artifacts are cached in the `redb-sandbox-target` Podman
volume; remove that volume to force a clean sandbox build.
## Benchmarks
redb has similar performance to other top embedded key-value stores such as lmdb and rocksdb
| bulk load | 17063ms | **9232ms** | 13969ms | 18619ms | 15341ms |
| individual writes | **920ms** | 1598ms | 2432ms | 3488ms | 7040ms |
| batch writes | 1595ms | 942ms | 451ms | **353ms** | 2625ms |
| len() | **0ms** | **0ms** | 749ms | 1181ms | 30ms |
| random reads | 1138ms | **637ms** | 2911ms | 2177ms | 4283ms |
| random reads | 934ms | **631ms** | 2884ms | 2357ms | 4281ms |
| random range reads | 1174ms | **565ms** | 2734ms | 2564ms | 8431ms |
| random range reads | 1173ms | **565ms** | 2742ms | 2690ms | 8449ms |
| random reads (4 threads) | 1390ms | **840ms** | 3995ms | 2606ms | 7000ms |
| random reads (8 threads) | 757ms | **427ms** | 2147ms | 1352ms | 8123ms |
| random reads (16 threads) | 652ms | **216ms** | 1478ms | 963ms | 23022ms |
| random reads (32 threads) | 410ms | **125ms** | 1100ms | 576ms | 26536ms |
| removals | 23297ms | 10435ms | 6900ms | **6004ms** | 10323ms |
| uncompacted size | 4.00 GiB | 2.61 GiB | **893.18 MiB** | 1000.95 MiB | 1.09 GiB |
| compacted size | 1.69 GiB | 1.26 GiB | **454.71 MiB** | 1000.95 MiB | 556.85 MiB |
Source code for benchmark [here](./crates/redb-bench/benches/lmdb_benchmark.rs). Results collected on a Ryzen 9950X3D with Samsung 9100 PRO NVMe.
## License
Licensed under either of
* [Apache License, Version 2.0](LICENSE-APACHE)
* [MIT License](LICENSE-MIT)
at your option.
### Contribution
Unless you explicitly state otherwise, any contribution intentionally
submitted for inclusion in the work by you, as defined in the Apache-2.0
license, shall be dual licensed as above, without any additional terms or
conditions.