{"id":310,"date":"2026-06-03T13:00:15","date_gmt":"2026-06-03T13:00:15","guid":{"rendered":"https:\/\/abrarqasim.com\/blog\/valkey-vs-redis-2026-what-i-switched-and-what-stayed\/"},"modified":"2026-06-03T13:00:15","modified_gmt":"2026-06-03T13:00:15","slug":"valkey-vs-redis-2026-what-i-switched-and-what-stayed","status":"publish","type":"post","link":"https:\/\/abrarqasim.com\/blog\/valkey-vs-redis-2026-what-i-switched-and-what-stayed\/","title":{"rendered":"Valkey vs Redis in 2026: What I Switched and What Stayed"},"content":{"rendered":"<p>Okay, so I held off on writing this for almost a year because I assumed the dust would settle. It mostly hasn&rsquo;t. Valkey shipped, AWS shipped it, every major Linux distro now packages it as the default key-value store, and people keep asking me the same question on Twitter: did you actually switch?<\/p>\n<p>Short answer: half of my production caches now run Valkey, half still run Redis. The cutover wasn&rsquo;t a manifesto. It was three pull requests, a few Terraform diffs, and two weekends of checking that nothing broke. Nothing broke.<\/p>\n<p>This post is the boring version of what happened. Not the license drama, not the Reddit threads, just the parts that actually affect what you deploy. I&rsquo;ll tell you which workloads I moved, which I kept on Redis, and why the choice isn&rsquo;t as obvious as either side claims.<\/p>\n<h2 id=\"whats-actually-different-between-valkey-and-redis\">What&rsquo;s actually different between Valkey and Redis<\/h2>\n<p>I had to keep reminding myself of this: Valkey forked from Redis 7.2.4 in March 2024 after Redis Inc. moved away from BSD-3 to a dual SSPL\/RSALv2 license. The Linux Foundation <a href=\"https:\/\/www.linuxfoundation.org\/press\/linux-foundation-launches-open-source-valkey-community\" rel=\"nofollow noopener\" target=\"_blank\">picked up the fork<\/a>, several of the most active core contributors went with it (including Madelyn Olson at AWS), and AWS, Google Cloud, Oracle, and a stack of others put real engineers on it.<\/p>\n<p>In practice that means the wire protocol is identical. RESP2, RESP3, cluster mode, sentinel. All of it. My existing <code>redis-cli<\/code> works against a Valkey 8 instance and so does the <code>ioredis<\/code> client I had on a Node.js API I haven&rsquo;t touched in two years. I didn&rsquo;t change a single line of application code on the services I moved.<\/p>\n<p>The differences are in licensing, governance, and now in roadmap. Valkey 8 added <a href=\"https:\/\/github.com\/valkey-io\/valkey\/releases\" rel=\"nofollow noopener\" target=\"_blank\">multi-threaded I\/O improvements<\/a> that Redis Inc. is also working on but shipped later. Redis 8.x has Vector Sets and a different vector-similarity story. Both are real. Neither is decisive for most workloads.<\/p>\n<pre><code class=\"language-bash\"># Same client, same protocol, both servers respond\n$ redis-cli -h cache.prod.internal -p 6379 PING\nPONG\n$ redis-cli -h cache-vk.prod.internal -p 6379 PING\nPONG\n<\/code><\/pre>\n<p>If you&rsquo;re using Redis as a cache or a queue with BullMQ or Sidekiq, the move is genuinely uneventful.<\/p>\n<h2 id=\"where-i-switched-caching-layer-for-a-nextjs-app\">Where I switched: caching layer for a Next.js app<\/h2>\n<p>The biggest case was a Next.js app I run that uses Redis for session storage and for caching API responses from a vendor. Hot path traffic, maybe 4k req\/s at peak, mostly GET \/ SET \/ EXPIRE.<\/p>\n<p>I migrated this in February. The actual steps were:<\/p>\n<ol>\n<li>Spun up a Valkey 8 cluster on AWS ElastiCache, which <a href=\"https:\/\/aws.amazon.com\/blogs\/database\/introducing-amazon-elasticache-for-valkey\/\" rel=\"nofollow noopener\" target=\"_blank\">shipped Valkey support<\/a> at about a third lower list price than the equivalent Redis offering.<\/li>\n<li>Used Redis&rsquo;s <code>MIGRATE<\/code> command to copy a few keys for sanity. For the live cutover I dual-wrote for 48 hours and then switched the read endpoint.<\/li>\n<li>Deleted the old cluster.<\/li>\n<\/ol>\n<p>Total downtime: zero. Total code change: one environment variable. The cost change was real and not marketing fluff. For this workload, my monthly bill dropped from about $214 to $145.<\/p>\n<p>The interesting part wasn&rsquo;t the savings. It was that nothing in our error budgets, latency graphs, or p99s moved. I keep a private dashboard for this kind of decision and the only delta was the line item on the AWS invoice.<\/p>\n<h2 id=\"where-i-stayed-on-redis-the-stack-features\">Where I stayed on Redis: the Stack features<\/h2>\n<p>The other half of my stack uses Redis Stack. Specifically RediSearch and RedisJSON. I have one service that does full-text and vector search over a few hundred thousand documents, and another that stores nested JSON state for a workflow engine.<\/p>\n<p>Valkey 8 didn&rsquo;t ship equivalents. There are forks like <a href=\"https:\/\/github.com\/valkey-io\/valkey-search\" rel=\"nofollow noopener\" target=\"_blank\">valkey-search<\/a> and <a href=\"https:\/\/github.com\/valkey-io\/valkey-json\" rel=\"nofollow noopener\" target=\"_blank\">valkey-json<\/a> but they aren&rsquo;t at the same maturity level. The Redis Stack modules are battle-tested, the docs are good, and the licensing change doesn&rsquo;t actually bite me if I&rsquo;m just running them in EC2. The <a href=\"https:\/\/redis.io\/blog\/redis-adopts-dual-source-available-licensing\/\" rel=\"nofollow noopener\" target=\"_blank\">RSALv2\/SSPL terms<\/a> restrict cloud providers who want to resell Redis as a service, not most end-user companies running it as part of their own product.<\/p>\n<p>So I kept Redis Stack on the two services that needed it. Plain key-value caches and queues are on Valkey.<\/p>\n<pre><code class=\"language-yaml\"># docker-compose snippet, Valkey for cache, Redis Stack for search\nservices:\n  cache:\n    image: valkey\/valkey:8.1-alpine\n    ports: [&quot;6379:6379&quot;]\n    command: valkey-server --save &quot;&quot; --appendonly no\n\n  search:\n    image: redis\/redis-stack-server:7.4.0-v0\n    ports: [&quot;6380:6379&quot;]\n<\/code><\/pre>\n<p>The point is you can mix them. They speak the same protocol on the same network, and your application code doesn&rsquo;t care.<\/p>\n<h2 id=\"the-performance-question-with-actual-numbers\">The performance question, with actual numbers<\/h2>\n<p>I keep seeing benchmark posts comparing Valkey 8 and Redis 7.4 that have Valkey winning by 2 to 3x on ops\/sec. They&rsquo;re real but the conditions matter. Valkey 8&rsquo;s multi-threaded I\/O is a meaningful upgrade for high-connection workloads. If you have one Node.js process pulling 5k req\/s against a single Redis instance, you&rsquo;ll see modest gains. If you have 200 connections from different services hammering the same instance, you&rsquo;ll see big gains.<\/p>\n<p>I ran a sloppy benchmark on my own gear before I committed:<\/p>\n<pre><code># Single client, 50 parallel connections, GET-heavy\n$ redis-benchmark -h cache-redis -t get -n 1000000 -c 50 -q\nGET: 138217.51 requests per second\n\n$ redis-benchmark -h cache-valkey -t get -n 1000000 -c 50 -q\nGET: 161031.69 requests per second\n<\/code><\/pre>\n<p>That&rsquo;s about 16% faster, not 200%. The benchmarks claiming massive gains usually run with hundreds of clients, which is where the I\/O threading pays off. Your workload probably looks more like mine than like the benchmark.<\/p>\n<p>The <a href=\"https:\/\/valkey.io\/blog\/unlock-one-million-rps\/\" rel=\"nofollow noopener\" target=\"_blank\">Valkey performance writeup<\/a> is honest about this. Read it before you make claims in your stand-up.<\/p>\n<h2 id=\"the-boring-operational-stuff-that-actually-matters\">The boring operational stuff that actually matters<\/h2>\n<p>Three things I cared about more than the license fight.<\/p>\n<p>Client library support. All the major clients (<code>node-redis<\/code>, <code>ioredis<\/code>, <code>redis-py<\/code>, <code>go-redis<\/code>, <code>jedis<\/code>, <code>lettuce<\/code>) explicitly support Valkey because the protocol is the same. The official Valkey project is also building <a href=\"https:\/\/github.com\/valkey-io\/valkey-glide\" rel=\"nofollow noopener\" target=\"_blank\">valkey-glide<\/a>, a multi-language client co-developed by AWS. It&rsquo;s good. I haven&rsquo;t switched off <code>ioredis<\/code> because it works, but glide is a real option now.<\/p>\n<p>Observability. Same <code>INFO<\/code>, same <code>MONITOR<\/code>, same <code>SLOWLOG<\/code>. My Datadog dashboards didn&rsquo;t need a single change. Prometheus exporters for both are interchangeable in my setup.<\/p>\n<p>Hosted options. AWS ElastiCache for Valkey is GA and cheaper. Google Cloud has Memorystore for Valkey. Aiven has both. DigitalOcean Managed Databases offers both. If you&rsquo;re self-hosting, the Docker images are equivalent in resource footprint.<\/p>\n<p>The thing nobody tells you: ElastiCache for Redis 7.x and ElastiCache for Valkey 8.x are not the same SKU. You can&rsquo;t just &ldquo;upgrade.&rdquo; You spin up a new cluster and migrate. That&rsquo;s how I did it and it&rsquo;s the only sane way.<\/p>\n<h2 id=\"so-what-do-i-actually-recommend\">So what do I actually recommend<\/h2>\n<p>If you&rsquo;re using Redis as a cache or a queue and you don&rsquo;t depend on Stack modules, go to Valkey. It&rsquo;s cheaper on managed services, the performance is at least equivalent, the licensing is fully open source under BSD-3, and the migration is genuinely trivial.<\/p>\n<p>If you depend on RediSearch, RedisJSON, RedisTimeSeries, or RedisBloom in production today, stay on Redis. The Valkey ecosystem will eventually fill those gaps, but I don&rsquo;t bet production on &ldquo;eventually.&rdquo;<\/p>\n<p>If you&rsquo;re greenfield and you need search or vector capabilities, evaluate both Redis Stack and a separate purpose-built tool. Postgres can handle a lot more than people give it credit for, and I made that case in detail in <a href=\"https:\/\/abrarqasim.com\/blog\/postgres-jsonb-2026-when-i-reach-for-it\" rel=\"noopener\">my post on Postgres JSONB<\/a>.<\/p>\n<p>The honest answer to &ldquo;should I switch&rdquo; is: pick the boring choice. For caches and queues, Valkey is the boring choice now. For everything else, you already know.<\/p>\n<p>If you want a sanity check on a specific workload, I take consulting calls on this kind of infrastructure decision. There are details on my <a href=\"https:\/\/abrarqasim.com\/about\" rel=\"noopener\">portfolio<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I moved some production caches to Valkey and kept Redis on others. Here&#8217;s what actually changed, what stayed identical, and when I&#8217;d still pick Redis.<\/p>\n","protected":false},"author":2,"featured_media":309,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"","rank_math_description":"I moved some production caches to Valkey and kept Redis on others. Here's what actually changed, what stayed identical, and when I'd still pick Redis.","rank_math_focus_keyword":"valkey vs redis","rank_math_canonical_url":"","rank_math_robots":"","footnotes":""},"categories":[346,351],"tags":[353,178,349,307,352],"class_list":["post-310","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database","category-infrastructure","tag-caching","tag-database","tag-infrastructure","tag-redis","tag-valkey"],"_links":{"self":[{"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/posts\/310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/comments?post=310"}],"version-history":[{"count":0,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/posts\/310\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/media\/309"}],"wp:attachment":[{"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/media?parent=310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/categories?post=310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/abrarqasim.com\/blog\/wp-json\/wp\/v2\/tags?post=310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}