Redis protocol server, written in Rust · v0.4.0
One process instead of a cache, a lock service and a delay queue.
Ruvio speaks RESP, so redis-cli and your existing clients connect. Each shard owns its keys: no lock on the hot path, and the durability you choose at startup.
- 29M GET/SET per second on 8 shards
- Up to 8.18× a Lua script, as one command
- 299 commands
- 6 first-party clients
- Linux, macOS and Windows builds
$ docker run -d -p 6379:6379 \
-e RUVIO_REQUIREPASS=change-me \
salihcantekin/ruvio:linux
$ redis-cli -a change-me
6379> LEASE job:nightly 30000
(integer) 1
6379> LIMIT api:key:42 100 60000
(integer) 99In motion
A node drops off and the cluster keeps going
The coordinator promotes a replica by majority vote and clients follow the new primary on their own. The scenes below play one after another: slot moves, locks, caches and rate limits.
Performance
Faster than Redis on the commands you run every day
Each bar is one command measured against Redis 8.10.2 on the same machine. Bars outside the dashed ring are faster than Redis; bars inside it are slower.
Each bar is one command against Redis. See every command, memory and the whole-machine results.
Source: benchmark/records/mac-2026-10-28.json · Apple silicon, 12 cores, 24 GiB, macOS 26.7.1 arm64 · 50 clients, pipeline 16 · in-memory profile, 1 shard · all results
Each bar is one command against Redis. See every command, memory and the whole-machine results.
Source: benchmark/records/x86-azure-2026-10-11.json · Azure VM, AMD EPYC 7763 (virtualized), 8 vCPU = 4 cores x 2 threads, 31 GiB, Ubuntu 24.04, kernel 6.17.0-azure; data disk Premium SSD v2 32 GiB (16,000 IOPS, 400 MB/s, host caching none) with ext4; OS disk Standard SSD. Native processes only (no Docker). · 50 clients, pipeline 16 · in-memory profile, 1 shard · all results
Durability
Choose how much you can afford to lose
Pick a profile at startup. A write is checked, appended, then applied; if the log cannot take the record, the key stays as it was and later writes are refused.
alwaysfdatasync before the replyOnly a write that was never acknowledged (a torn final record).
everysecsync_interval_ms = 1000Writes the kernel accepted but had not synced yet.
snapshotsnapshot_interval_ms = 60000Writes after the last durable checkpoint.
memoryno disk writesAll in-memory state when the process stops.
Bounds from docs/RECOVERY.md; intervals are the defaults in ruvio.example.toml.
Compatibility
Your Redis client already works. Six have typed methods.
299 commands in 21 families, with cluster routing from one seed address in every first-party client.
Run it next to your app in a minute
One binary or one container. Your Redis client already knows how to talk to it.