all posts

The Best Managed Redis Providers in 2026

Ajay Kumar··9 min read

Redis has an unusual property among databases: it is trivially easy to run and unusually easy to run badly. A single container gets you a working cache in thirty seconds. What gets you six months later is the part nobody demoed — what happens when memory fills up, what happens when the process restarts, and what happens when your bill turns out to be indexed to something you never thought of as a unit of work.

I'm Ajay, I build PandaStack. We run managed Postgres and we deliberately do not run managed Redis, which puts me in the odd position of writing a buyer's guide for a product I don't sell. That's actually the useful position: I have no reason to steer you anywhere, and I'll say up front where the honest answer is 'you probably don't need a managed Redis at all'.

The four things that actually differ between providers

Every provider's landing page says 'fast, managed, highly available'. That's table stakes and tells you nothing. Here is what genuinely varies, and what you should be reading the docs for.

1. The billing unit

This is the single biggest split in the market, and it decides the shape of your bill more than the price per unit does. Provisioned providers sell you a memory tier — you pay for 1 GB whether you store 4 keys or 4 million. Request-priced providers sell you commands — you pay nothing at idle and something per operation. Neither is cheaper in general. A cache with a low, steady hit rate is cheap on provisioned and ruinous on per-request. A dev environment that's idle 20 hours a day is the reverse.

The trap with per-command pricing is that Redis clients issue far more commands than your application logic implies. A session middleware that reads and refreshes a TTL on every request is two commands per HTTP request before your code does anything. Connection health checks, keyspace notifications and client-side cache invalidation all bill. Count commands from an actual traffic sample, not from your mental model.

2. What happens when memory fills

Redis' behaviour at the memory limit is set by maxmemory-policy, and the default in a stock Redis build is noeviction — which means writes start failing with an OOM error rather than old keys being dropped. Providers override this differently, and some don't let you change it. If you are using Redis as a cache you almost certainly want allkeys-lru or allkeys-lfu. If you are using it as a queue or a lock store, eviction is catastrophic and you want noeviction plus an alert well before the ceiling.

The worst outcome is mixing both workloads in one instance. Your cache fills memory, the eviction policy drops your job queue's keys, and you lose work you thought was durable. Two instances — or a real queue — costs less than that incident.

3. Whether the data survives a restart

Managed Redis persistence comes in three grades and providers are frequently vague about which one you bought. RDB snapshots write a point-in-time dump every N seconds — a restart loses whatever happened since the last dump. AOF (append-only file) logs every write, and with fsync-per-second you lose at most a second. Some tiers do neither and the whole dataset is gone on failover. If you'd be upset to lose the contents, find the exact word 'AOF' in the docs before you commit.

4. How you actually reach it

Redis speaks its own binary protocol (RESP) over a raw TCP socket on 6379. That matters more than it sounds, because a lot of modern hosting infrastructure only routes HTTP. If your compute lives behind an HTTP-only edge, a plain Redis endpoint is unreachable from it, which is exactly why the REST-over-HTTP Redis providers exist. Check the network path before the price.

The providers

Redis Cloud

The first-party service from the company that employs the maintainers. It is the reference implementation: you get the current Redis version, the full module ecosystem (search, JSON, time series, vector similarity), Active-Active geo-replication and proper AOF. It is also priced like an enterprise product once you leave the free tier. Pick it when you use Redis as a database rather than a cache — the modules are the differentiator and nobody else has all of them.

Upstash

The per-request, scale-to-zero option, and the one that made HTTP-accessible Redis mainstream. Its REST API is the reason it's the default choice for edge functions and Vercel/Cloudflare-hosted apps: you can talk to it from a runtime that has fetch and nothing else. Costs nothing at idle. The economics invert at sustained high throughput — model your command count before committing, because the crossover happens earlier than people expect.

AWS ElastiCache and MemoryDB

Two different products that get confused constantly. ElastiCache is a cache — fast, replicated, and explicitly not durable. MemoryDB is the durable one: it writes to a multi-AZ transaction log and is positioned as a primary database. If you are already deep in AWS and your compute sits in the same VPC, ElastiCache is the path of least resistance and the network latency is as good as it gets. Outside a VPC it's awkward, and both are provisioned-priced with no idle discount.

Valkey-based services (DigitalOcean, Linode, Scaleway, Aiven)

After Redis changed its licence in 2024, the Linux Foundation fork Valkey became the default for most cloud providers' 'managed Redis' offering. For ordinary cache and session workloads the protocol is compatible and your client library will not notice. The gap is the proprietary modules — if your code touches RediSearch or RedisJSON, a Valkey service is not a drop-in. These providers compete on price and on being in the same datacentre as your other resources, which is a perfectly good reason to pick one.

Platform add-ons (Render, Railway, Fly, Heroku)

Every app platform sells a Redis add-on that provisions in one click on the same private network as your app. The convenience is real and the latency is good. The catch is that these are usually the thinnest wrapper available: fewer persistence options, less visibility, and a migration path that means changing platforms. Fine for a cache. Think harder if it's holding anything you'd miss.

When to skip managed Redis entirely

Two cases come up constantly and in both the managed instance is dead weight.

The first is a single-instance app that just wants a cache. A network round trip to a managed Redis in another datacentre can cost more than the database query you were caching. Redis running on localhost inside your app's own VM has no network hop at all, and for a cache — data you can rebuild by definition — the durability story doesn't matter. On PandaStack that's literally a line in your start command, because an app runs in its own Firecracker microVM with a full Linux userspace rather than a locked-down function runtime:

# In your app's build command -- installs into the app's own microVM.
apt-get install -y redis-server

# In your start command -- Redis on localhost, then your app.
redis-server --daemonize yes --maxmemory 256mb --maxmemory-policy allkeys-lru \
  && node server.js
This is a localhost-only pattern by design. PandaStack's per-port URLs are an HTTP reverse proxy, not a TCP tunnel, so a raw Redis port inside a sandbox is not reachable from the public internet. That's the right shape for a co-located cache and the wrong shape for a shared one — if two services need the same Redis, you need a real managed provider.

The second case is using Redis for something Postgres already does well. A job queue with modest throughput is fine as a Postgres table with SELECT ... FOR UPDATE SKIP LOCKED. A distributed lock is a Postgres advisory lock, which has the enormous advantage of releasing itself when the connection dies rather than stranding a stale lock key. Rate limiting is a small table with a window column. None of these are as fast as Redis; all of them remove a service, a failure mode and a bill. If you already run Postgres, spend the Redis budget only where you actually need microsecond reads.

How to choose in ten minutes

  1. Write down whether losing the entire dataset is an incident or a shrug. That single answer eliminates half the market.
  2. Sample an hour of real traffic and count Redis commands per second, including client heartbeats. Multiply out against a per-request price and a provisioned tier and compare honestly.
  3. Check the network path from your compute to the endpoint. If your runtime can only make HTTP requests, you need an HTTP-capable provider and the decision is already made.
  4. Confirm the eviction policy you can actually set, and never share an instance between a cache and a queue.
  5. If the answer to step 1 was 'a shrug', and only one service uses it, seriously consider running it on localhost next to your app instead.

The summary

Redis Cloud if you use Redis as a database and want the modules. Upstash if your workload is spiky, idle-heavy, or lives somewhere that only speaks HTTP. ElastiCache or MemoryDB if your compute already lives in a VPC and you want the shortest network path. A Valkey service from whoever hosts the rest of your infrastructure if you just need a competent cache at a good price. And genuinely consider no managed Redis at all — a localhost cache in your app's own VM, or a Postgres table doing the job, removes a whole moving part that has to be paid for, monitored and recovered.

Frequently asked questions

Is Valkey a safe replacement for Redis?

For the core data types and commands, yes — Valkey is a fork of Redis 7.2 maintained under the Linux Foundation, and standard client libraries work unchanged against it. The incompatibility is the proprietary module layer: RediSearch, RedisJSON, RedisTimeSeries and the vector similarity features are not part of Valkey. If your application only uses strings, hashes, lists, sorted sets, pub/sub and expiry, a Valkey-based managed service is a drop-in. If you grep your codebase and find FT.SEARCH or JSON.SET, it is not.

Does managed Redis lose data on failover?

It depends entirely on the persistence mode, which varies by provider and often by tier within a provider. With RDB snapshots only, you lose everything written since the last snapshot, which can be minutes. With AOF and per-second fsync, you lose at most about a second. Some cache-positioned tiers persist nothing at all and come back empty. This is the specification to check before you buy, because 'highly available' and 'durable' are not the same claim and marketing pages routinely blur them.

Is per-request Redis pricing cheaper than a provisioned instance?

Only for spiky or idle-heavy workloads. Per-request pricing wins decisively for a dev environment, a cron-driven job, or an app with real overnight quiet periods, because idle costs nothing. It loses for anything with sustained throughput, because Redis clients issue far more commands than application logic suggests — session middleware alone can be two commands per HTTP request before your handler runs. Sample real traffic for an hour, count actual commands including client heartbeats, and compare the two models on that number rather than on an estimate.

Can I run Redis inside a PandaStack sandbox or app?

Yes, as a co-located cache. An app runs in its own Firecracker microVM with a full Linux userspace, so you can apt-get install redis-server in the build command and start it alongside your process. It listens on localhost with no network hop, which is faster than any managed instance in another datacentre. What you cannot currently do is expose that Redis to the outside world — the per-port URLs are an HTTP reverse proxy, not a raw TCP tunnel, so 6379 is unreachable externally. Co-located cache: great. Shared Redis across services: use a managed provider.

Should I use Redis or Postgres for a background job queue?

If you already run Postgres and your throughput is in the hundreds of jobs per second rather than the hundreds of thousands, Postgres is usually the better answer. SELECT ... FOR UPDATE SKIP LOCKED gives you safe concurrent dequeue, the jobs are transactional with the rest of your data, and you can inspect the queue with ordinary SQL. Redis is faster and has purpose-built primitives, but it adds a service with its own persistence, eviction and failure semantics — and an evicted queue key is lost work, not a cache miss.

Keep reading

Run code in a microVM in one API call.

49ms p50 cold start. Fork, snapshot, and scale to zero.

Start free
Written by Ajay Kumar, Founder, PandaStack.