Benchmarks
How fast, and where it isn't
One machine, 16 cores, loopback. Every figure is reproducible from bench/ in the repository. Read the last two rows before you decide anything — they are the ones where speed is not a reason to switch.
Four engines, one machine
50 connections, small values. Median of five runs, counted from each server's own command counter over a three-second steady window rather than from the benchmark client's reported rate.
| kevy 4.0 | Redis 8 | valkey 9.1 | Dragonfly | vs Redis 8 | |
|---|---|---|---|---|---|
| GET | 7,800,299 | 5,597,865 | 3,014,687 | 2,132,210 | 1.39× |
| SET | 6,918,058 | 2,573,396 | 1,749,976 | 1,511,377 | 2.69× |
| INCR | 6,133,940 | 3,459,395 | 2,484,273 | 1,387,568 | 1.77× |
| SADD | 5,600,597 | 3,690,483 | 2,385,857 | 1,678,098 | 1.52× |
| HSET | 4,287,217 | 3,021,325 | 1,970,791 | 1,515,763 | 1.42× |
| LPUSH | 3,213,470 | 2,862,374 | 1,943,222 | 1,320,497 | 1.12× |
| ZADD | 3,053,101 | 2,773,929 | 1,802,759 | 1,455,126 | 1.10× |
LPUSH is 12% ahead of Redis 8, and ZADD 10%. At that margin your value sizes and key distribution decide the winner, not the engine — so if lists or sorted sets are your hot path, benchmark your own workload and do not switch for speed. The rows are coloured that way on purpose.
What this does not tell you
It is loopback. There is no network here, and in a real deployment the network is usually what you are waiting for. An engine 2.6× faster at GET will not make your p99 2.6× better if most of your latency is the wire.
The values are small. At 64 KB per value the whole thing becomes bound by the kernel's TCP path and the gap closes to single digits. If you store large blobs, these numbers are not about you.
It is one machine. kevy has no cluster mode. If your problem is that a single machine is not enough, no number on this page helps.
The browser build
What you actually ship to a tab.
| Size | ||
|---|---|---|
| kevy.wasm | 416 KB | the engine, uncompressed |
| gzipped | 151 KB | what crosses the wire |
| Cold start | < 20 ms | compile and instantiate, warm cache |
localStorage beats kevy on a small synchronous read, and always will — it is a map in the page's own address space. kevy wins on the things that make localStorage a bad idea anyway: real TTLs, no 5 MB ceiling, byte values rather than strings, and writes that do not block the main thread.
Reproduce it
git clone https://github.com/goliajp/kevy && cd kevy
# four-way: kevy, Redis 8, valkey, Dragonfly
bash bench/arena.sh
# the regression gate CI runs on every push
bash bench/perfgate.sh