Stackness
Sign up
Valkey vs Redis vs Dragonfly in 2026: forkless BGSAVE, INCREX and which one takes the cache slot

Valkey vs Redis vs Dragonfly in 2026: forkless BGSAVE, INCREX and which one takes the cache slot

For a new stack's cache in October 2026, pick Valkey 9.1, the stable line: it is BSD-licensed, and on Amazon ElastiCache a Valkey node costs 20% less than the same Redis OSS node ($0.1752 against $0.219 an hour for a cache.r7g.large in us-east-1). Pick Redis 8.10 when you want JSON, search and vector sets bundled, and Dragonfly when one node has to take more writes than about eight cores of Valkey can. Two of Valkey 9.2's changes that matter for a cache, forkless BGSAVE and INCREX, shipped only in 9.2.0-rc1 on 16 September 2026, with general availability targeted for 15 November.

The facts that decide, side by side

The deciding facts for a cache are the licence, what a snapshot costs in memory, what the managed version costs and how hard it is to leave. Values are from each project's releases, licence files and the AWS and Google Cloud pricing pages, checked on 14 October 2026.

Valkey Redis Dragonfly
Licence BSD 3-Clause RSALv2, SSPLv1 or AGPLv3 since 8.0 BSL 1.1, becomes Apache 2.0 later
Latest stable 9.1.2, 31 August 8.10.2, 17 September v2.0.2, 7 October
In release candidate 9.2.0-rc1, 16 September none none
Threading One command thread plus I/O threads One command thread plus I/O threads One shard per thread, shared nothing
Snapshots fork(); forkless BGSAVE opt-in in 9.2 rc1 fork() Forkless by design, no AOF
INCREX 9.2 rc1 8.8.0 and later Not listed
ElastiCache node price 20% below Redis OSS Baseline Not offered
ElastiCache Serverless $0.084 per GB-hour $0.125 per GB-hour Not offered
Google Cloud Memorystore Same node price as Redis Cluster Same node price as Valkey Not offered

Sources: Valkey releases, Redis releases, Dragonfly releases, ElastiCache pricing, Memorystore for Valkey pricing.

On Stackness, as of 14 October 2026, 2 real profiles list Redis and none list Valkey or Dragonfly, after removing bot accounts (data sources). The numbers are too small to say what people run side by side, which is why this post leans on outside measurements. All three sit with the DevOps and infrastructure tools developers list.

Valkey 9.2's forkless BGSAVE cuts the snapshot spike to 10 MB and makes saves slower

Valkey 9.2's forkless BGSAVE saves a snapshot from a background thread instead of a forked child, so there is no copy-on-write memory to pay for. On a 1.1 GB dataset under steady writes, Alex Georgiev reported on 4 October a memory rise of 9.9 MB during the save, against 354 MB with fork().

The same run shows what the saving costs:

3 million keys of 300 bytes, 8 writer threads fork() forkless
Memory rise during the save 354.4 MB 9.9 MB
Save time 3 s 5-6 s
Writer throughput during the run 27,202 ops/s 23,034 ops/s
Worst PING round trip, mean of 7 runs 20.1 ms 7.2 ms

Writes fell about 15% and the save took two to three seconds longer, but the worst PING was faster, likely because no fork() stalls the main thread. Georgiev did not name his hardware, ran Docker on one host and labels the post as AI-assisted. On an idle dataset, fork() cost him only about 12 MB, so the 350 MB figure needs a write load.

The feature is opt-in in two steps, per PR #4460: forkless-infrastructure-enabled yes at startup, which adds 4 bytes of metadata per key and cannot be set with CONFIG SET, then bgsave-default-method forkless. A write to a key the thread has not saved yet may wait until it has. AOF rewrite and replica full sync still fork, and an open issue lists crash bugs found during forkless saves, some still reproducing on 16 September.

For a pure cache, the change may be worth nothing. A cache that runs with save "" never takes a BGSAVE. It matters when the same instance also holds sessions or queues you persist, on a box sized with little memory headroom.

INCREX ships in both Valkey 9.2 and Redis 8.8, with different options

INCREX increments a counter and sets its expiry in one command, which closes the gap where a client dies between INCR and EXPIRE and leaves a counter that never expires. Redis 8.8.0 shipped an INCREX on 25 May 2026. Valkey's arrived in 9.2.0-rc1, and the two take different arguments.

Valkey 9.2  INCREX key [NX|XX] [EX s|PX ms|EXAT ts|PXAT ms-ts] [BYINT n|BYFLOAT f]
Redis 8.8   INCREX key [BYFLOAT f|BYINT n] [LBOUND lo] [UBOUND hi] [SATURATE]
                   [EX s|PX ms|EXAT ts|PXAT ms-ts|PERSIST] [ENX]

Valkey's NX and XX test whether the key exists, and skip the whole command, increment included, when the test fails. Redis's ENX sets the expiry only when the key has none, which is the fixed-window rate limiter, and UBOUND caps the counter. The rate limiter in the Redis docs amounts to INCREX ratelimit:{id} BYINT 1 UBOUND 100 EX 60 ENX. In Valkey's 9.2.0-rc1 source, an expiry option is applied on every call, so EX 60 slides the window forward from each hit; a fixed window needs EXAT with the window's end. Code written for one INCREX will not run on the other.

The crash window was avoidable before. The Redis INCR page wraps INCR and EXPIRE in MULTI/EXEC, or uses a Lua script. In Georgiev's INCREX test of 7 October, 11 simulated crashes in 500 requests left 11 keys without a TTL under INCR plus EXPIRE and none under INCREX, but his script injects the INCREX crash before the command is sent, so that zero shows atomicity rather than measuring it. The measured gain is the round trip: INCREX was 1.6 to 2.0 times faster than two blocking calls and 1.1 to 1.2 times faster than a pipelined pair.

Why does a busy Redis reclaim expired memory faster than an idle one?

A busy Redis reclaims expired keys faster because every read that touches a dead key deletes it on the spot, and a fast expiry cycle is tried on every pass of the event loop, so more traffic means more passes. An idle server relies on the background cycle, which runs ten times a second and keeps sampling 20 keys with a TTL at a time while more than 10% of them have expired, up to 25% of CPU time (expire.c in 8.10.2).

Reclaim times after a mass expiry, Redis 8.10.2 on 2 vCPU, and managed Valkey 9 on 1 vCPU for the last bar. Chart from redis-expiry-lag by Kalin Dimitrov, MIT licence.

In a test posted on 2 October, five million keys given one EXPIREAT deadline held 810 MB for 22.8 seconds on an idle Redis 8.10.2. Raising hz from 10 to 100 cut that to 13.7 seconds; one client reading with SCAN cut it to 5.1. On DigitalOcean's managed Valkey 9 with 1 vCPU, one million keys took 7.5 seconds, against 3.2 locally.

The lag turns into errors under Redis's default noeviction policy. With maxmemory set slightly above a 4 million key dataset, writes were refused with an OOM error for 2.5 seconds after the expiry, while the same test under allkeys-lru lost no live keys. Two defaults differ here: Valkey 8 and later free expired values in the background (lazyfree-lazy-expire yes), while Redis 8.10.2 frees them on the main thread. For any of the three stores used as a cache, set an allkeys-lru or allkeys-lfu policy and add jitter to expiry times.

Dragonfly's throughput numbers come from Dragonfly

The only hard Dragonfly numbers this month are Dragonfly's own. The Redis vs Dragonfly post of 6 October published no benchmark numbers: the author pointed an existing connection string at Dragonfly, the clients worked, and he lists the gaps he found in the docs and the issue tracker. Dragonfly's head-to-head with Valkey 9.0, published on 17 June 2026, is vendor-run.

AWS Graviton, setex writes, 64-byte values Dragonfly Valkey 9.0, 8 I/O threads
m7g.2xlarge (8 vCPU), writes per second 816K 548K
m7g.2xlarge, reads per second 848K 811K
m7g.2xlarge, write P99 787 µs 3,283 µs
m7g.4xlarge (16 vCPU), writes per second 1,563K 599K
Bytes per entry 127 149

On eight cores, reads are within 5%. The gap is writes, write tail latency and anything above eight cores: doubling to 16 vCPU took Valkey from 548K to 599K writes a second and Dragonfly to 1,563K. Dragonfly's snapshots never fork, and it has no AOF. Its compatibility table marks about 70 commands unsupported, among them FUNCTION, FCALL and MODULE LOAD, and does not list INCREX. Lua scripts that touch undeclared keys are rejected unless you set allow-undeclared-keys.

The licence is BSL 1.1: production use is allowed inside your own product, as long as that product is not itself an in-memory data store and Dragonfly is not offered as a service to others. Versions from v1.40 become Apache 2.0 on 1 November 2030 or four years after their release, whichever comes first, which for every release so far is the four-year date (LICENSE.md). Since v2.0.2 of 7 October, the daily version check also sends anonymous deployment details such as architecture, cloud provider and thread count.

What switching between them costs

Switching cost depends on direction. Valkey reads Redis RDB files up to 7.2, the version it forked from, but with the default rdb-version-check strict it refuses RDB versions 12 to 79, and Redis 8.10.2 writes version 15 (rdb.h). Moving a Redis 8 dataset to Valkey is a logical migration: reload from the source of truth, replicate with a tool, or copy key by key.

For a cache, a reload is usually the whole migration: point the clients at the new host and let it warm. The cost sits in the commands you use. Redis 8 bundles JSON, search, time series, probabilistic types and vector sets, with nothing extra to install; on Valkey, JSON, search and bloom filters are separate modules (valkey-json, valkey-search, valkey-bloom). INCREX does not port between the two. Dragonfly v2.0.0 loads Valkey 9 RDB files, and moving to it means checking your scripts and transactions against its compatibility table.

On managed hosting, ElastiCache prices Valkey 20% below Redis OSS on nodes and 33% below on Serverless, with a 100 MB Serverless minimum instead of 1 GB. Memorystore charges the same for both, so there the choice is features, not price.

Pick Valkey if, pick Redis if, pick Dragonfly if

Pick Valkey if:

  • You want a BSD-licensed store and the Redis API you already know.
  • You run on ElastiCache, where it is 20 to 33% cheaper than Redis OSS.
  • You persist snapshots on a box with little memory headroom and can wait for 9.2's GA, targeted for 15 November.
  • Your rate limiter can live with a sliding window, or you set EXAT yourself.

Pick Redis if:

  • You want JSON, search, vector sets or time series bundled, with nothing extra to install.
  • You want a fixed-window INCREX with ENX and an upper bound today, in a stable release.
  • You are already on Redis 8 with RDB backups you need to restore, since Valkey's default rdb-version-check strict refuses them.

Pick Dragonfly if:

  • One node has to take more writes than about eight cores of Valkey, and you would rather scale up than run a cluster.
  • Write tail latency matters more to you than the full command set.
  • You do not use AOF, FUNCTION or modules, and the BSL terms fit your product.

Key numbers

  • 354 MB to 9.9 MB: memory rise during a BGSAVE of 1.1 GB, fork() against forkless, Valkey 9.2.0-rc1, 4 October 2026 (Georgiev).
  • 22.8 seconds: time an idle Redis 8.10.2 held 810 MB after five million keys expired at once, 2 October 2026 (redis-expiry-lag).
  • 20%: ElastiCache node discount for Valkey against Redis OSS, 33% on Serverless, pricing checked 14 October 2026 (AWS).
  • 816K against 548K: writes per second, Dragonfly against Valkey 9.0 on an 8 vCPU Graviton node, vendor-run, 17 June 2026 (Dragonfly).
  • 15 November 2026: Valkey 9.2.0 GA target, after rc1 on 16 September 2026 (release plan).

Which of these do you use?

Nobody on Stackness runs Valkey yet. Tick what you use and be the first.

Lonny skating the lakeside path, kickflipping onto a bench, grinding it and flipping offStackness gamesPlay Lonny Eagle Amateur Skater 4A pixel art skateboarding game. Signing up opens it straight away.+2 secret games you unlock as you goSign up to play