sled is a free, open source databases project written in Rust and released under Apache-2.0. It has 9,091 GitHub stars, 427 forks and 172 open issues, and was last pushed 6 months ago. On this registry it ranks #94 of 203 tracked projects in Databases, with 5 head-to-head comparisons available.

What is sled?

sled is an embedded key-value database for Rust programs, written in Rust under the Apache-2.0 licence, aimed at developers who want a threadsafe, crash-safe local store inside their own process instead of running a separate database server.

What it is

sled is an embedded key-value store that lives in the Rust and crates.io ecosystem. It presents an API similar to a threadsafe BTreeMap, opened with sled::open("/tmp/welcome-to-sled"), which returns a Tree supporting insert, get, remove, range, compare_and_swap, and flush. The project describes itself as "the champagne of beta embedded databases", and the repository carries 9091 stars, 427 forks, and 172 open issues, with the last push on 2026-04-04.

The concrete thing it replaces is the separate database process: a client-server store that a program reaches over a network, together with its driver and its serialization boundary. Because sled is a library, reads can be zero-copy and the README points to a structured example for working with structured data without paying expensive deserialization costs. It also replaces an in-process BTreeMap or hash map when data must survive a restart, since sled is durable on disk and offers ACID transactions.

Key capabilities

  • Serializable ACID transactions for atomically reading and writing multiple keys across multiple keyspaces, plus fully atomic single-key operations including compare_and_swap.
  • Multiple keyspaces through open_tree, write batches through apply_batch, and merge operators.
  • Change notification on key prefixes via watch_prefix.
  • Forward and reverse iterators over ranges of items.
  • A crash-safe monotonic ID generator documented at 75-125 million unique IDs per second.
  • zstd compression, enabled through the compression build feature, which is disabled by default.
  • Flash-optimized log-structured storage with a CPU-scalable lock-free implementation, using prefix encoding and suffix truncation; for sequential fixed-length keys the system can avoid storing 99% or more of the key data, essentially acting like a learned index.
  • IVec, an inlinable Arced slice used for efficiency, alongside zero-copy reads.

Who uses it and how

  • Single-process Rust services that need local persistence: sled does not support multiple open instances, so the instance is kept open for the process lifespan, often as a global lazy_static.
  • Latency-sensitive workloads that want to avoid deserialization cost, using the structured access example.
  • Services that need unique identifiers without coordination, using the monotonic ID generator.
  • Applications that layer an ORM or structured access layer over a key-value engine, as the topic list indicates.
  • Teams that stress crash-safety and concurrency, reflected in the crash-testing, fuzzing, and formal-methods topics.

Getting started

sled is consumed as a Rust crate from crates.io: add the sled dependency to Cargo.toml and call sled::open with a filesystem path. The facts provide no Docker image, compose file, or hosted option; deployment is a library dependency inside a Rust binary.

How it compares

The facts name no comparable tools or paid products, so sled stands alone in this registry on the axes of licence, self-hosting, and cost model. The only contrast the README draws is against standard-library data structures, whose API it deliberately mirrors, and against systems that charge serialization cost on every access.

When to use it — and when not to

A self-hoster operates only a filesystem path and a process, with no database server to run, but must manage disk usage and durability: sled fsyncs every 500ms by default, configurable through flush_every_ms, or callable manually through flush and flush_async. Avoid it if the workload needs multiple processes or nodes sharing one database, since multiple open instances are unsupported, and note that transactions are optimistic, so IO inside a transaction closure must be idempotent. The README also warns it is out of sync with the main branch, which contains a large in-progress rewrite, so stability expectations should match a beta project.

project readme (upstream, from github) — read inline

sled - it's all downhill from here!!!

An embedded database.

let tree = sled::open("/tmp/welcome-to-sled")?;

// insert and get, similar to std's BTreeMap
let old_value = tree.insert("key", "value")?;

assert_eq!(
  tree.get(&"key")?,
  Some(sled::IVec::from("value")),
);

// range queries
for kv_result in tree.range("key_1".."key_9") {}

// deletion
let old_value = tree.remove(&"key")?;

// atomic compare and swap
tree.compare_and_swap(
  "key",
  Some("current_value"),
  Some("new_value"),
)?;

// block until all operations are stable on disk
// (flush_async also available to get a Future)
tree.flush()?;

$${\color{red}This \space README \space is \space out \space of \space sync \space with \space the \space main \space branch \space which \space contains \space a \space large \space in-progress \space rewrite }$$

If you would like to work with structured data without paying expensive deserialization costs, check out the structured example!

features

expectations, gotchas, advice

performance

a note on lexicographic ordering and endianness

If you want to store numerical keys in a way that will play nicely with sled's iterators and ordered operations, please remember to store your numerical items in big-endian form. Little endian (the default of many things) will often appear to be doing the right thing until you start working with more than 256 items (more than 1 byte), causing lexicographic ordering of the serialized bytes to diverge from the lexicographic ordering of their deserialized numerical form.

interaction with async

If your dataset resides entirely in cache (achievable at startup by setting the cache to a large enough value and performing a full iteration) then all reads and writes are non-blocking and async-friendly, without needing to use Futures or an async runtime.

To asynchronously suspend your async task on the durability of writes, we support the flush_async method, which returns a Future that your async tasks can await the completion of if they require high durability guarantees and you are willing to pay the latency costs of fsync. Note that sled automatically tries to sync all data to disk several times per second in the background without blocking user threads.

We support async subscription to events that happen on key prefixes, because the Subscriber struct implements Future>:

let sled = sled::open("my_db").unwrap();

let mut sub = sled.watch_prefix("");

sled.insert(b"a", b"a").unwrap();

extreme::run(async move {
    while let Some(event) = (&mut sub).await {
        println!("got event {:?}", event);
    }
});

minimum supported Rust version (MSRV)

We support Rust 1.62 and up.

architecture

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. check out the architectural outlook for a more detailed overview of where we're at and where we see things going!

philosophy

  1. don't make the user think. the interface should be obvious.
  2. don't surprise users with performance traps.
  3. don't wake up operators. bring reliability techniques from academia into real-world practice.
  4. don't use so much electricity. our data structures should play to modern hardware's strengths.

known issues, warnings

priorities

  1. A full rewrite of sled's storage subsystem is happening on a modular basis as part of the komora project, in p

readme truncated — read the full docs on github

Frequently asked questions

Is sled free to use?

sled is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does sled do?

the champagne of beta embedded databases

What is sled written in?

sled is primarily written in Rust. Its source is publicly available at https://github.com/spacejam/sled, and it has 9,091 GitHub stars.