Benchmarks

Performance comparison against Redis, DragonflyDB, and DiceDB.

Test Setup

  • Hardware: 6-core Intel i5-11400H (12 hardware threads)
  • Network: Loopback TCP (127.0.0.1)
  • Clients: 100 concurrent connections
  • Operations: 1M total (10K per client)
  • FyroDB: 1 node
  • Redis: 6-node Redis Cluster (7 containers)
  • Pipeline: 100 commands per batch
  • Pub/Sub: 50 subscribers, 10 publishers, 200K messages, pipeline 200

All tests run with the same Go benchmark tool. Best of three runs.

KV Throughput

MetricFyroDBRedis Cluster (6 nodes)DragonflyDBDiceDB (1 node)
Pipeline-64 SET8.95M5.75M4.09M766K
Pipelined SET20.08M7.56M4.16M1.62M
Pipelined GET28.16M11.29M4.09M1.88M

Pipeline-64 SET · empty → 1M keys

FyroDB
8.95M
Redis Cluster
5.75M
DragonflyDB
4.09M
DiceDB (1 node)
766K

M ops/sec

SET throughput · pipeline 100

FyroDB
20.08M
Redis Cluster
7.56M
DragonflyDB
4.16M
DiceDB (1 node)
1.62M

M ops/sec

GET throughput · pipeline 100

FyroDB
28.16M
Redis Cluster
11.29M
DragonflyDB
4.09M
DiceDB (1 node)
1.88M

M ops/sec

Mixed Workload Throughput

MetricFyroDBRedis Cluster (6 nodes)DragonflyDBSpeedup
Mixed SET/GET (50/50)20.90M7.24M5.15M2.9×
INCR (counters)50.11M6.32M6.84M7.9×
HSET/HGET (sessions)33.07M7.95M5.81M4.2×
LPUSH/RPOP (queue)39.26M7.19M6.23M5.5×
SADD (per-client sets)27.87M6.34M5.00M4.4×
ZADD (per-client zsets)18.12M4.55M4.36M4.0×
JSON.SET/GET (docs)14.91M3.38M151.5K4.4×
SET+EXPIRE (cache TTL)10.51M2.64M2.41M4.0×
Hot Key (contention)44.07M2.03M2.15M21.7×
Producer/Consumer36.20M981.3K1.75M36.9×

Mixed SET/GET (50/50)

FyroDB
20.90M
Redis Cluster
7.24M
DragonflyDB
5.15M

M ops/sec

INCR · atomic counters

FyroDB
50.11M
DragonflyDB
6.84M
Redis Cluster
6.32M

M ops/sec

HSET/HGET · sessions

FyroDB
33.07M
Redis Cluster
7.95M
DragonflyDB
5.81M

M ops/sec

LPUSH/RPOP · queue

FyroDB
39.26M
Redis Cluster
7.19M
DragonflyDB
6.23M

M ops/sec

SADD · per-client sets

FyroDB
27.87M
Redis Cluster
6.34M
DragonflyDB
5.00M

M ops/sec

ZADD · per-client zsets

FyroDB
18.12M
Redis Cluster
4.55M
DragonflyDB
4.36M

M ops/sec

JSON.SET/GET · documents

FyroDB
14.91M
Redis Cluster
3.38M
DragonflyDB
151.5K

M ops/sec

SET+EXPIRE · cache TTL

FyroDB
10.51M
Redis Cluster
2.64M
DragonflyDB
2.41M

M ops/sec

Hot Key · 1 key, contention

FyroDB
44.07M
DragonflyDB
2.15M
Redis Cluster
2.03M

M ops/sec

Producer/Consumer · 50+50

FyroDB
36.20M
DragonflyDB
1.75M
Redis Cluster
981.3K

M ops/sec

Pub/Sub Throughput

MetricFyroDBRedis Cluster (6 nodes)DragonflyDBDiceDB (1 node)
Publish ops/sec1.49M147.1K315.5K167.8K
Delivery msg/sec74.64M7.35M15.43M8.39M

Pub/Sub publish throughput

FyroDB
1.49M
DragonflyDB
315.5K
DiceDB (1 node)
167.8K
Redis Cluster
147.1K

M ops/sec

Pub/Sub delivery throughput

FyroDB
74.64M
DragonflyDB
15.43M
DiceDB (1 node)
8.39M
Redis Cluster
7.35M

M msg/sec

Resource Usage

Measured over the full benchmark suite across all processes.

MetricFyroDB (1 node, PID 2258)Redis Cluster (6 nodes, 7 containers)DragonflyDB (1 node)
Peak RSS294.19 MB767.63 MB235.80 MB
Avg RSS168.81 MB347.46 MB171.86 MB
Peak CPU79.6%442.1%957.5%
Avg CPU42.5%125.2%430.6%

Peak RSS · lower is better

DragonflyDB
235.80 MB
FyroDB
294.19 MB
Redis Cluster
767.63 MB

MB

Avg CPU · lower is better

FyroDB
42.5%
Redis Cluster
125.2%
DragonflyDB
430.6%

% of one core

Two things worth reading carefully:

  • The DragonflyDB numbers are freshly measured for this release as a single multi-threaded node on the same 6-core/12-thread machine; the DiceDB column is an earlier measurement carried over and was not re-run, so treat it as indicative.
  • DragonflyDB is a single multi-threaded process, so it is the closest single-node comparison to a single FyroDB node. It uses every core at once (peak CPU 957.5%) yet FyroDB still delivers higher throughput on every workload while using a fraction of the CPU. See Production Tips.

Why FyroDB Is Faster

FactorRedisDragonflyDBFyroDB
ThreadingSingle-threadedMulti-threaded (shared-nothing)Thread-per-core (one epoll loop per CPU)
Hash mapCustom, single-threadDash (lock per segment)Lock-free sharded map with EBR
WritesIn-place (single thread)Lock + copyPer-key spinlock, in-place, no clone
ReadsSingle threadLock per segmentWait-free via seqlock + EBR
Value accessCopyCopyZero-copy GET (direct to TCP buffer)
Pub/SubSingle-thread fan-outThread-per-connectionLock-free Arc snapshot, per-CPU delivery
Hash probeDeref entry per stepSegment scanHash tag in the slot pointer rejects non-matches without a deref
Hot keySerialized by designLock per segmentReads never lock; writers back off then yield
Cluster16384-slot arrayn/aShared flat routing table, version-checked per connection

Run Your Own Benchmark

The benchmark tool lives in the repository, so start from a clone:

git clone https://github.com/Rana718/FyroDB && cd FyroDB/bench
 
go run .                            # Full (KV + Pub/Sub + Mixed)
go run . -m key                     # KV only
go run . -m pub                     # Pub/Sub only
go run . -m mix                     # Mixed workloads only
go run . -p 6379                    # Against Redis
go run . -cluster addr1,addr2,...   # Against a cluster

The clone also ships shortcuts that start each side with a matched core count and tear it down again. Run task --list inside it to see them; the cluster ones are redis-up-12 / bench-redis-cluster-12 and fyro-up / bench-fyro-cluster-12, plus 6-core equivalents without the -12 suffix.

Reproducing these numbers depends on details that are easy to get wrong, so the committed Redis compose files pin one master per core, disable persistence, use host networking so no NAT hop sits on the critical path, and assign slot ranges that match the harness's own key-to-node mapping. Without that last part a handful of boundary slots get sent to the wrong node and the harness treats the resulting MOVED as fatal.

FlagDefaultDescription
-p8000Server port
-mallMode: all, key, pub, mix
--clusterComma-separated cluster addresses