Every chapter, in reading order. Each one is a markdown file in the repository — what you read here and what GitHub shows are the same text.
How to think in keys when you are used to thinking in tables.
Recipes that run: sessions, rate limits, queues, leaderboards, feeds.
The append-only log, snapshots, and what survives a kill -9.
Shards, connections, and the two flags that actually matter.
HRANDFIELD, keyspace-event config over the wire, four RESP3 shapes and one GEOPOS reply corrected.
Nothing on the server changes; two client crates finally reach crates.io at the engine's version.
Stop 5.1, start 5.2 on the same directory — the Lua dialects now match upstream.
Stop 5.0, start 5.1 on the same directory — a read hazard repaired and two stalls removed.
Stop 4.1.1, start 5.0 on the same directory — and what behaves differently.
The older majors: 2.x to 3.x and 3.x to 4.0.
One primary, N replicas, and the offset that tells you the truth.
Failover, epochs, and the writes we will not promise to keep.
Why there is no cluster, and what to do instead.
A RAM budget for a store bigger than RAM — cold values spill to disk, every command unchanged.
The flag that bought 10.6% by giving fewer cores the listener.
The opt-in allocator: ~10% smaller RSS, priced honestly.
Unix sockets: no TCP, no loopback, no kernel copy.
Pipelining, and why the engine has no async runtime.
Secondary indexes: how they build, and what they cost.
Declare typed columns and indexes once; query them like a table, at kevy speed.
Eight production-paid lessons from replacing hand-maintained indexes.
KNN over your keyspace. No embedding model included.
BM25 full-text, and where it stops.
Materialised views, kept fresh by the write path.
A change feed you can tail from another process.
Channels, patterns, and what happens to a slow subscriber.
EVAL, on an interpreter we wrote.
One allocation per declared row, and the ordering that decides whether it saves anything.
151 KB in a browser tab, persisted to OPFS.
Embed the engine and still speak RESP on a socket.
no_std, no allocator, no operating system.
What kevy refuses, why, and what to use instead — read before you build on a guess.
Every error string, and the contract it is part of.
What a relational workload costs here, honestly.
Moving in from Redis, and back out again.
Every verb the engine answers, generated from the table it dispatches on.