Tutorial

Databases

Valkey vs Redis in 2026: comparison and migration guide

In 2024, Redis's switch to the RSALv2 and SSPLv1 licences shook the open source ecosystem. The Linux Foundation, with AWS, Google Cloud, Oracle, Ericsson and Snap, responded with Valkey, a collectively maintained BSD fork. Since then, Redis reversed course by adding AGPLv3 with Redis 8 in May 2025 — a positive signal, but AGPLv3 is a strong copyleft: anyone who modifies Redis and offers it over a network must publish those modifications, creating real constraints for reseller hosting providers and commercial software vendors. Valkey 9.1, released in May 2026, is the current stable branch; Fedora adopted Valkey in place of Redis, and Debian and Ubuntu both ship it in their official repositories. This guide covers the real differences — protocol, data format, module API, client libraries, configuration — and helps you choose and migrate in four steps.

12 min read4 steps
Contents· Why the Redis/Valkey debate is back in 20261/11
  1. 01Why the Redis/Valkey debate is back in 2026
  2. 02Redis vs Valkey: key differences in 2026
  3. 03Protocol compatibility: RESP2 and RESP3
  4. 04Data formats: RDB and AOF compatible up to Redis 7.2
  5. 05Command API: what is identical, what differs
  6. 06Configuration: parameters to check when switching
  7. 07Client libraries: what you don't change
  8. 08When to choose Valkey over Redis
  9. 09Migrate from Redis to Valkey in 4 steps
  10. 10What does not change in a Redis → Valkey migration
  11. 11What about your other databases on VPS?

Why the Redis/Valkey debate is back in 2026

In March 2024, Redis Ltd. announced that from Redis 7.4 onwards the code would be released under a dual RSALv2 and SSPLv1 licence, neither of them OSI-approved. The reaction was immediate: the Linux Foundation launched Valkey with support from AWS, Google Cloud, Oracle, Ericsson and Snap. The fork started from Redis 7.2.4 under the BSD licence. In May 2025, Redis 8 added AGPLv3, an OSI-approved licence, as an option alongside the other two — a positive signal, but AGPLv3 is strong copyleft: anyone who modifies Redis and makes it available to users over a network must publish the source code of those modifications, raising real questions for reseller hosting providers and commercial software vendors. Meanwhile, Fedora replaced Redis with Valkey from Fedora 41, and Debian 13 and Ubuntu 24.04 both ship a valkey-server package in their official repositories.

Redis vs Valkey: key differences in 2026

Scroll the table

CriterionRedis 8 (AGPLv3, RSALv2 or SSPLv1)Valkey 9.1 (BSD)
LicenceAGPLv3 as an option — strong copyleft; RSALv2 and SSPLv1 restrict managed-service offeringsBSD 3-Clause — permissive, free commercial use
PerformanceHistorical baselineComparable — measure on your workload with `valkey-benchmark`
Protocol compatibility100% Redis protocol100% Redis protocol — transparent replacement
Distro support`redis-server` package in Debian and UbuntuReplaces Redis in Fedora 41+; `valkey-server` package in Debian 13 and Ubuntu 24.04
ModulesJSON, search, time series and probabilistic types built into Redis 8Compatible module API; official valkey-json, valkey-bloom, valkey-search modules
Cloud adoptionRedis Cloud, the vendor's managed offeringOffered by AWS ElastiCache and Google Cloud Memorystore
Best forExisting projects depending on Redis Stack modulesNew projects, hosting providers, sovereign stacks, modern distros

Protocol compatibility: RESP2 and RESP3

The most common question before a migration is about the protocol. Valkey implements 100% of the Redis Serialization Protocol in both versions.

RESP2 (the historic protocol) is fully supported. All your existing client libraries — ioredis, Predis, redis-py, Jedis, StackExchange.Redis — communicate with Valkey without any code or configuration changes. The replacement is transparent at the socket level.

RESP3 (introduced with Redis 6.0) is also supported by Valkey 9.1. This protocol brings enriched response types — maps, sets, doubles, booleans, attributes — allowing modern clients to reduce parsing round-trips. Libraries that enable RESP3 by default (ioredis 6, redis-py 8) work without modification with Valkey.

One point to verify: if your client negotiates the protocol via the HELLO command, Valkey responds identically to Redis. The HELLO 3 command activates RESP3 on both systems the same way. You can confirm this on an existing Valkey instance with valkey-cli HELLO 3.

Data formats: RDB and AOF compatible up to Redis 7.2

The persistence file format is the other critical point of a migration, and this is where your starting version matters. Valkey is compatible with Redis OSS 7.2 and all earlier open source versions; from Redis 7.4 onwards, the data files no longer are.

RDB (Redis Database Backup): Valkey reads RDB files up to version 11, the one used by Redis 7.2. A dump.rdb file produced by Redis 7.2 or earlier imports directly into Valkey 9.1 by placing it in Valkey's dir directory before startup. Redis 7.4 and Redis 8 write RDB version 12 and above, which Valkey rejects by default; the rdb-version-check relaxed option attempts a best-effort load, aborted as soon as unknown data appears. From those versions, use a key-by-key migration (MIGRATE or a dedicated tool) or let the cache rebuild itself.

AOF (Append-Only File): up to Redis 7.2, the AOF journal format is the same as Valkey's. If you use AOF persistence or mixed mode (aof-use-rdb-preamble yes) on those versions, your existing files are read by Valkey without modification. The BGSAVE and BGREWRITEAOF commands behave the same way.

In-memory data format: Valkey data structures — strings, hashes, lists, sets, sorted sets, streams, HyperLogLog, bitmaps, geospatial — are the same as in Redis. Their internal encodings (listpack, skiplist, quicklist, intset) may change from one version to the next with no effect on the client side. A client that stores a hash in Redis retrieves it intact from Valkey.

Command API: what is identical, what differs

The full Redis 7.2 command set is supported by Valkey. The main categories — strings, hashes, lists, sets, sorted sets, streams, pub/sub, transactions, Lua scripting, keyspace notifications, cluster — work identically.

Lua scripting: Valkey supports EVAL, EVALSHA and SCRIPT LOAD. Lua scripts written for Redis run without modification on Valkey. The cjson library and redis.call() functions are available, with one nuance: Valkey has added the server namespace (server.call()) for new scripts, but redis.call() remains functional for backwards compatibility.

Cluster: the Gossip protocol and cluster management commands (CLUSTER INFO, CLUSTER NODES, CLUSTER MEET, CLUSTER FAILOVER) are identical. A Valkey node can join a Redis 7.2 or earlier cluster as a replica, which allows the switchover — however, a mixed Redis/Valkey cluster is not recommended in production: major versions may introduce behavioural differences on internal commands. Migrating nodes one by one remains the safe path.

ACL (Access Control Lists): the ACL rule format is identical. An aclfile exported from Redis (ACL SAVE) can be reloaded into Valkey. The ACL LIST, ACL SETUSER, ACL GETUSER commands work identically.

Keyspace notifications: the notify-keyspace-events configuration and subscription patterns (__keyevent@*__:set, etc.) are identical. Your pub/sub consumers listening to keyspace events do not need to be modified.

What differs: the Redis Stack modules — RedisJSON, RediSearch, RedisTimeSeries, RedisBloom — built into Redis 8 do not ship with Valkey. Valkey publishes its own official modules: valkey-json (JSON.*), valkey-bloom (BF.*) and valkey-search (FT.*, vector search), but the API is not guaranteed to be identical and no official module replaces RedisTimeSeries. If your code calls commands like JSON.SET, FT.SEARCH or TS.ADD, test each one before migrating.

Configuration: parameters to check when switching

The valkey.conf syntax is identical to redis.conf. You can copy your existing configuration file without rewriting. A few points require specific attention.

Default paths: Valkey uses /etc/valkey/valkey.conf and /var/lib/valkey/ instead of /etc/redis/ and /var/lib/redis/. If you copy your configuration, update the dir, logfile, pidfile and aclfile directives to point to Valkey paths.

systemd service name: the service is called valkey-server on Debian and Ubuntu (with a valkey alias) and valkey on Fedora. Commands are therefore systemctl start valkey-server or systemctl enable valkey.

TLS: Valkey supports TLS on client connections (tls-port, tls-cert-file, tls-key-file, tls-ca-cert-file) identically to Redis 6+. If you have enabled TLS in Redis, the same configuration works in Valkey without modifying your clients.

maxmemory and eviction: eviction policies (allkeys-lru, volatile-lru, allkeys-lfu, noeviction, etc.) are identical. Your current policy transfers directly.

Bind and protection-mode: Valkey starts in protected mode by default (like Redis), refusing non-loopback connections if no password is defined. Your bind and requirepass (or ACL) configuration transposes directly.

Client libraries: what you don't change

This is one of Valkey's strengths: no client library requires modification to connect to Valkey. Since the protocol is identical, the client does not know whether it is talking to Redis or Valkey.

JavaScript / Node.js: ioredis, node-redis (the redis npm package), redis — all work. Change only the host and port in your connection configuration.

Python: redis-py (the redis package on PyPI) and its asynchronous client redis.asyncio, which replaces aioredis — compatible. The connection Redis(host='valkey-host', port=6379) works without any other change.

PHP: phpredis (C extension), Predis (pure PHP) — compatible. No code changes.

Java: Jedis, Lettuce, Redisson — compatible. Adapt only the connection parameters.

.NET: StackExchange.Redis — compatible. Same connection string, host and port updated.

Go: go-redis, rueidis — compatible.

If you use an abstraction like Laravel Cache (CACHE_STORE=redis), Django django-redis, Spring Data Redis or Symfony Cache with the Redis adapter, these abstraction layers reconnect to Valkey without code changes — only the connection DSN changes.

When to choose Valkey over Redis

Valkey is the natural choice in several contexts. Hosting providers and resellers are the most affected: Redis's AGPLv3 requires publishing modifications made to Redis as soon as it is offered over a network, and its two other licences (RSALv2, SSPLv1) restrict offering Redis as a managed service — constraints that are hard to reconcile with most commercial offerings. New projects that do not need Redis 8's modules have little reason to start on Redis: Valkey is available in the repositories of recent distributions and its BSD licence has no restrictions. GDPR and sovereignty stacks also benefit from the Linux Foundation governance, which is more neutral than a private vendor. Finally, if you are coming from Redis 7.2 or earlier and do not use the Redis Stack modules (RedisJSON, RediSearch, RedisTimeSeries), migration is transparent — all your existing libraries and configurations remain valid.

Migrate from Redis to Valkey in 4 steps

  1. Verify compatibility

    Run redis-cli INFO server | grep redis_version to identify your current version. List your dependencies and confirm none uses Redis Stack modules (RedisJSON, RediSearch, RedisTimeSeries). If so, direct migration is not yet recommended. Beyond Redis 7.2 (7.4, 8.x), your RDB and AOF files cannot be read by Valkey: plan a key-by-key migration. Also check your Lua scripts: redis.call() remains compatible, but identify any call to proprietary module commands.

  2. Install Valkey

    On Ubuntu 24.04+ and Debian 13, Valkey is available in native repositories: apt install valkey-server (Ubuntu 24.04 ships the 7.2 branch, Debian 13 the 8.1 branch). On Fedora 41+, dnf install valkey. For a newer version, use the official binaries or the valkey/valkey Docker image published on valkey.io. The package installs valkey-server and, through its dependencies, valkey-cli and valkey-benchmark — tools functionally identical to their Redis counterparts.

  3. Copy configuration and data

    The configuration syntax is identical between Redis and Valkey. Copy your file and update the paths: cp /etc/redis/redis.conf /etc/valkey/valkey.conf, then adapt dir, logfile, pidfile to point to /var/lib/valkey/ and /var/log/valkey/. Export your Redis data via an RDB snapshot (redis-cli --rdb /tmp/dump.rdb) then place the file in Valkey's dir directory. If AOF is enabled in Valkey's configuration, disable it (appendonly no) on the first start, otherwise the RDB file is not imported, then re-enable it (valkey-cli CONFIG SET appendonly yes). To avoid downtime, make Valkey a replica of Redis instead (REPLICAOF <redis-ip> 6379, with masterauth if Redis requires a password), then run REPLICAOF NO ONE after the switchover.

  4. Start Valkey and validate

    Start the service (systemctl start valkey-server, or valkey on Fedora), then validate with valkey-cli ping — you should receive PONG. Verify your data is present with valkey-cli DBSIZE and compare with the key count from your old Redis instance. Test your application on a few representative requests before cutting over from Redis. If you use ACLs, reload your exported ACL file with valkey-cli ACL LOAD. All your client libraries (ioredis, Predis, redis-py) are compatible without modification — change only the connection host.

Valkey includes valkey-benchmark, functionally identical to redis-benchmark. Before any production migration, validate performance on your hardware with valkey-benchmark -n 100000 -q. This command sends 100,000 requests and displays the ops/sec summary for each command type. Compare the figures with those of your old Redis instance on the same server. To specifically test pipelining and RESP3, add the -P 16 option (16 requests per batch) or -3.

What does not change in a Redis → Valkey migration

  • All your client libraries (ioredis, redis-py, Predis, Jedis, StackExchange.Redis, go-redis) — no code changes
  • The communication protocol: RESP2 and RESP3 are fully supported
  • Your RDB and AOF persistence files, if they come from Redis 7.2 or earlier — readable by Valkey without conversion
  • The redis.conf syntax — copy the file and update the paths
  • Your Lua scripts — redis.call() works, server.call() is additionally available
  • Your ACL rules exported from Redis — reloaded directly into Valkey
  • TLS configuration, memory eviction policies and keyspace notifications
  • The usual redis-cli commands — valkey-cli accepts them all

What about your other databases on VPS?

Valkey is just one piece of your data stack. If you also host a relational database, see our guide on MariaDB on VPS: configuration, performance and replication. For full-text search, our Elasticsearch on VPS guide covers installation, memory tuning and production indexes. Each component deserves configuration adapted to your workload — our Cloud VPS gives you full control of your environment.

Deploy Valkey on a controlled VPS

Our Cloud VPS gives you full root access to install Valkey, configure your data stack and optimise performance to your real needs. No proprietary overlay, no licence constraints.