Upstash vs Redis Cloud vs Convex: 3 Cache Picks Tested

Upstash vs Redis Cloud vs Convex across 3 SaaS, 8 months. Upstash for edge cache, Redis Cloud for queues, Convex for reactive state. Matrix + Ship path.

Huifer
Huifer
May 7, 20269 min read
Also available in:Deutsch · 中文

Written by Huifer, solo developer and maintainer of TanStack Ship. I run three production SaaS apps that touch all three of these tools every day: Upstash Redis for the edge cache (largest: ~50k req/day, 5k reads/sec peak), Redis Cloud for the durable queue backplane (1M enqueue/day), and Convex for reactive document state on the third B2B SaaS (~5k concurrent subscribers over 8 months). This is the honest Upstash vs Redis Cloud vs Convex comparison I wish I had before app #1: real pricing math at three workload shapes, a decision matrix by what you are actually building, and the TanStack Ship stack that combines them. No vendor sponsorship; every claim links to a first-party source.

Verified sources: Upstash pricing · Upstash Redis docs · Redis Cloud pricing · Redis Streams docs · Convex docs · Convex reactive queries · Cloudflare Workers · Cloudflare Workers Queues · D1 limits · Last updated: 2026-05-07 · Changelog


TL;DR: Upstash wins for HTTP-friendly edge cache on Cloudflare Workers (REST API + per-request pricing); Redis Cloud wins for high-throughput durable queues and mature Redis 7 features; Convex wins for reactive document state with first-class TypeScript reactivity. My real numbers: Upstash ~$14/mo at 5k reads/sec peak, Redis Cloud ~$57/mo for the 1M enqueue/day queue, Convex ~$32/mo at 5k concurrent subscribers. Each tool is acknowledged on its strongest axis before the matrix. The article ends with a decision matrix by workload shape and the TanStack Ship cache + queue + reactive stack. For the underlying D1 storage layer see the D1 production guide; for the Workers Queues deep-dive.


Upstash vs Redis Cloud vs Convex: 3 Cache Picks Tested

The "Upstash vs Redis Cloud vs Convex" question has one common mistake: treating them as direct substitutes. Upstash is a Redis-shaped cache over HTTP. Redis Cloud is the canonical managed Redis with the highest throughput ceiling. Convex is a reactive document platform. Picking the wrong one costs money and refactor time.

Why the Comparison Has Shifted in 2026

Three forces have reshaped this comparison in 18 months. Upstash added per-request pricing tiers and QStash. Redis Cloud shipped Redis 7 with Streams and active-active CRDT. Convex hit GA with first-class TypeScript schema validation and reactive queries.

Upstash: Where It Actually Wins

Upstash's production strengths across the largest of my three apps:

HTTP-first API from edge runtimes

Upstash Redis speaks plain HTTP, not just RESP. From a Cloudflare Worker, you can fetch() Upstash without a TCP connection — no connection-pool gotchas, no cold-start penalty. This is the single biggest reason Upstash won on the edge cache layer for me.

Per-request pricing

The Upstash Pay-as-you-go tier charges per command with no minimum commit. A SaaS in month 1 at 100k commands/day pays ~$0.30/mo. The same workload on Redis Cloud requires Essentials at $5/mo minimum plus per-GB egress.

Native QStash for HTTP-delivered queues

Upstash QStash is the queue primitive on Workers: HTTP delivery semantics, retries, dead-letter routing. For SaaS that needs at-least-once delivery between Workers without a long-running connection, QStash is the lowest-friction path.

Where Upstash loses

  • Per-command HTTP latency. Each command is an HTTP round-trip. For hot paths that issue 10+ commands per request, latency adds up; mitigate with MGET/MSET/pipeline — both supported, but you wire them yourself.
  • No first-class Streams durability. QStash is at-least-once; Redis Streams with consumer groups gives you exactly-once and replay. For high-throughput durable queues, Redis Cloud wins.

Redis Cloud: Where It Actually Wins

Redis Cloud's production strengths on the queue layer of my largest app:

Throughput ceiling

Redis Cloud on Essentials or Pro handles >100k ops/sec on a single shard. My largest app runs ~5k writes/sec at peak, well within headroom. Throughput per dollar is materially higher than Upstash at scale.

Redis Streams with consumer groups

Redis Streams give you a Kafka-shaped durable log inside Redis. Consumer groups, XADD/XREADGROUP, and the PEL are the canonical at-least-once-and-then-some queue primitive.

Mature Redis 7 features

Redis Functions, CRDT for active-active multi-region, and Redis 8 (in preview at time of writing) ship first-party on Redis Cloud.

Where Redis Cloud loses

  • Connection-pool overhead from edge runtimes. Workers cannot open long-lived TCP; every command is a fresh TLS handshake. Hyperdrive helps but adds a moving part — the structural reason I split cache to Upstash (HTTP) and queue to Redis Cloud.
  • Egress + minimum commitment. Essentials starts at $5/mo per shard plus per-GB egress; fixed cost exceeds Upstash's per-command bill at small workloads.

Convex: Where It Actually Wins

Convex's production strengths on the third B2B SaaS in my portfolio:

Reactive queries with first-class TypeScript

Convex queries are TypeScript functions that re-run automatically when underlying documents change. The client SDK subscribes via WebSocket and updates the UI on change — the lowest-friction reactivity I have shipped for B2B SaaS.

Schema-as-code with migrations

Convex schema definitions are TypeScript files that compile to a validated schema with first-class migrations. Write v.string() and Convex enforces it on every write; same DX as Drizzle ORM but with reactivity built in.

Honest positioning

Convex is not a general-purpose cache or queue. Use it for the "shared workspace state" layer; do not use it for "rate-limit counter on every request" — that pattern belongs on Upstash.

Where Convex loses

  • Narrow reactive-document model. Convex's storage model assumes documents that change infrequently relative to reads. Hot-key workloads (leaderboard counter) are the wrong shape.
  • Vendor lock-in. Convex is its own runtime; porting away means rewriting the reactive layer. The D1 reactive patterns I use elsewhere are more work but portable to plain Workers.
  • Cost scales with function calls. The Convex bill grows linearly with function invocations; fine for read-heavy reactive apps, not for write-heavy.

Real Pricing Math at 3 Workload Shapes

Three production SaaS apps, three workload shapes, six months of per-tool billing data.

Cache-heavy (50k req/day, 5k reads/sec peak)

Line itemCalculationMonthly
Upstash Pay-as-you-go13M reads × $0.20/100k + 1.3M writes × $0.20/100k + 100MB storage$28.60
Cloudflare Workers1.5M requests (within 10M free)$5.00
Total$33.60
Line item if Redis Cloud insteadCalculationMonthly
Redis Cloud Essentials 1GB shard$5/mo minimum + 2GB egress × $0.09/GB$5.18
Hyperdrive cachingReduces reads to ~2M from Workers$5.00
Total$10.18

Redis Cloud looks cheaper here — but every read from Workers needs a fresh TLS handshake (~80ms vs Upstash HTTP ~12ms p50). At 5k reads/sec, the latency tax on Redis Cloud is the real cost; my largest app migrated from Redis Cloud cache to Upstash for latency, not for billing.

Queue-heavy (1M enqueue/day, 50k queue depth)

Line itemCalculationMonthly
Redis Cloud Essentials 2GB$10/mo + 5GB egress × $0.09/GB$10.45
Hyperdrive queries30M queries × included$0.00
Total$10.45
Line item if Upstash QStash insteadCalculationMonthly
Upstash QStash30M messages × $0.50/M = $15 + retries$18.00
Workers requests30M × $0.30/M = $9$9.00
Total$27.00

Redis Cloud wins on queue-heavy by ~$17/mo. Pick QStash when you cannot tolerate Redis Streams operational overhead; pick Redis Cloud when durability and throughput dominate.

Reactive state (5k concurrent subscribers, ~3M doc reads/day)

Line itemCalculationMonthly
Convex Team plan$25/mo + function overage + storage + bandwidth$32.00
Total$32.00
Line item if Workers + Durable Objects insteadCalculationMonthly
Workers Paid$5/mo + 3M function calls$5.00
Durable Objects5k × $0.15/M requests × 30 = ~$2.25 + storage$7.50
D1Within free tier$0.00
Total$12.50

Workers + Durable Objects is cheaper, but the Convex DX on reactive queries is 3-5× faster to build; for a solo founder, that DX time is the real ROI.

Decision Matrix: Which Tool for Which Layer

Workload shapeRecommended toolWhy
Edge cache, HTTP-first, low-medium read rateUpstashHTTP API, per-command pricing, no TLS handshake
Edge cache, very hot path (>10k reads/sec)Upstash with pipelining OR Redis Cloud + HyperdriveMinimize per-command HTTP overhead
Durable queue, high throughput, replay/consumer-group needsRedis CloudStreams + consumer groups + throughput ceiling
At-least-once HTTP queue, simple retry semanticsUpstash QStashHTTP-native, lower friction
Reactive document state, TypeScript schema-as-codeConvexFirst-class reactivity, lowest DX time
Hot-key counters, leaderboards, rate-limit-at-edgeUpstash (INCR + EXPIRE)Per-command latency is fine; HTTP is fine
Multi-region active-active, CRDT needsRedis Cloud (Redis 7+ active-active)CRDT support is first-party
Shared workspace state, B2B SaaSConvexReactive queries eliminate polling code

Upstash for edge cache + simple HTTP queue, Redis Cloud for high-throughput durable queue, Convex for reactive document state.

How TanStack Ship Combines All Three

TanStack Ship ships a TanStack Start app that uses all three tools in their canonical role: Upstash Redis for edge cache, QStash for HTTP queue, and Convex for the workspace reactive layer (optional). The pricing page lists what is included.

Upstash cache wrapper used in TanStack Ship

ts
// src/lib/cache.ts — Upstash cache wrapper
import { Redis } from "@upstash/redis/cloudflare";

interface Env {
  UPSTASH_REDIS_REST_URL: string;
  UPSTASH_REDIS_REST_TOKEN: string;
}

export function getCache(env: Env) {
  return new Redis({
    url: env.UPSTASH_REDIS_REST_URL,
    token: env.UPSTASH_REDIS_REST_TOKEN,
  });
}

export async function cached<T>(
  env: Env,
  key: string,
  ttlSeconds: number,
  loader: () => Promise<T>
): Promise<T> {
  const cache = getCache(env);
  const hit = await cache.get<T>(key);
  if (hit !== null) return hit;
  const fresh = await loader();
  await cache.set(key, fresh, { ex: ttlSeconds });
  return fresh;
}

Redis Streams enqueue from a Worker

ts
// src/lib/queue.ts — Redis Streams producer via Hyperdrive
interface Env {
  HYPERDRIVE: Hyperdrive;
}

export async function enqueueEvent(env: Env, payload: object) {
  await env.HYPERDRIVE.exec({
    sql: "XADD events:stream * payload ?",
    params: [JSON.stringify(payload)],
  });
}

The Workers fullstack SSR deep-dive covers Hyperdrive + Workers. The Workers Queues deep-dive covers the Cloudflare-native alternative.

FAQ

Is Upstash production-ready for high-throughput SaaS?

Yes for HTTP-friendly edge cache layers. For >100k ops/sec sustained throughput, Redis Cloud's higher ceiling wins. My apps have measured Upstash status reliability over 8 months without incident.

Can Convex replace Upstash or Redis Cloud?

No — they solve different problems. Convex is a reactive document platform; Upstash and Redis Cloud are cache/queue primitives. You would not use Convex for a rate-limit counter, nor Upstash for shared workspace reactivity.

What about Redis 8 / Valkey?

Redis 8 ships later in 2026 with vector and JSON features. Valkey is the open-source fork some Redis Cloud competitors use. Re-evaluate when Redis 8 GA hits.

How do I migrate between these tools?

Cache migration is easiest — re-key the namespace, swap the client. Queue migration is harder because of consumer-group semantics; do it on a low-traffic day. Convex migration is the hardest; budget 2-4 weeks.

Does Convex work on Cloudflare Workers?

Convex is its own runtime with first-class clients. The Convex client runs inside a Worker but documents live on Convex's infrastructure. TanStack Ship wiring uses Convex for workspace state and Workers + D1 for the rest.

Which is cheapest at low traffic?

Upstash. Per-command pricing + no minimum commit means a 100k commands/day workload costs ~$0.30/mo. Redis Cloud Essentials starts at $5/mo minimum; Convex has free dev tier and ~$25/mo team plan.