Skip to content

Instantly share code, notes, and snippets.

@joschan21
Created May 20, 2026 10:19
Show Gist options
  • Select an option

  • Save joschan21/c65266e17100311bd472be9ecbe2c167 to your computer and use it in GitHub Desktop.

Select an option

Save joschan21/c65266e17100311bd472be9ecbe2c167 to your computer and use it in GitHub Desktop.
A demo benchmark between Redis Cloud and Upstash Redis, as published on https://www.xadd.dev/comparison/upstash-vs-redis-cloud-a-2026-comparison
import Redis from "ioredis";
import { readFileSync } from "node:fs";
import { execSync } from "node:child_process";
import { hostname } from "node:os";
// Configure via env vars:
// UPSTASH_REDIS_TLS_URL=rediss://default:<token>@<host>:<port>
// REDIS_CLOUD_TLS_URL=rediss://default:<password>@<host>:<port>
// REDIS_CLOUD_CA_FILE=./redis_ca.pem (optional, defaults to ./redis_ca.pem)
const TARGETS = [
{
name: "Upstash TCP (TLS)",
url: process.env.UPSTASH_REDIS_TLS_URL,
caFile: null,
},
{
name: "Redis Cloud TCP (TLS, private CA)",
url: process.env.REDIS_CLOUD_TLS_URL,
caFile: process.env.REDIS_CLOUD_CA_FILE || "./redis_ca.pem",
},
];
const N = 2000;
const WARMUP = 200;
const CONCURRENT_N = 200;
const KEY = "bench:key";
function pct(arr, p) {
const s = [...arr].sort((a, b) => a - b);
const i = Math.min(s.length - 1, Math.floor(p * s.length));
return s[i];
}
function stats(samples) {
const sum = samples.reduce((a, b) => a + b, 0);
return {
n: samples.length,
mean: sum / samples.length,
p50: pct(samples, 0.5),
p90: pct(samples, 0.9),
p95: pct(samples, 0.95),
p99: pct(samples, 0.99),
min: Math.min(...samples),
max: Math.max(...samples),
};
}
async function timed(fn) {
const t = process.hrtime.bigint();
await fn();
return Number(process.hrtime.bigint() - t) / 1e6;
}
async function runSeq(fn) {
for (let i = 0; i < WARMUP; i++) await fn(i);
const samples = [];
for (let i = 0; i < N; i++) samples.push(await timed(() => fn(i)));
return stats(samples);
}
async function runConcurrentGets(client, n) {
for (let i = 0; i < WARMUP; i++) await client.get(KEY);
const t = process.hrtime.bigint();
await Promise.all(Array.from({ length: n }, () => client.get(KEY)));
const ms = Number(process.hrtime.bigint() - t) / 1e6;
return { totalMs: ms, opsPerSec: n / (ms / 1000), n };
}
function maskUrl(url) {
try {
const u = new URL(url);
return `${u.protocol}//***@${u.hostname}:${u.port}`;
} catch {
return "<invalid url>";
}
}
async function benchTarget({ name, url, caFile }) {
console.error(`\n== ${name} ==`);
const opts = { lazyConnect: true, maxRetriesPerRequest: 3, connectTimeout: 5000 };
if (caFile) {
opts.tls = { ca: readFileSync(caFile) };
}
const client = new Redis(url, opts);
try {
await client.connect();
} catch (e) {
console.error(` ! connect failed: ${e.message}`);
return null;
}
await client.set(KEY, "value");
const results = {};
results.GET = await runSeq(() => client.get(KEY));
console.error(` GET p50=${results.GET.p50.toFixed(2)} p99=${results.GET.p99.toFixed(2)}`);
results.SET = await runSeq((i) => client.set(KEY, `v${i}`));
console.error(` SET p50=${results.SET.p50.toFixed(2)} p99=${results.SET.p99.toFixed(2)}`);
results.INCR = await runSeq(() => client.incr("bench:ctr"));
console.error(` INCR p50=${results.INCR.p50.toFixed(2)} p99=${results.INCR.p99.toFixed(2)}`);
results["Pipeline x10 SETs"] = await runSeq((i) => {
const p = client.pipeline();
for (let j = 0; j < 10; j++) p.set(`bench:p:${j}`, `v${i}-${j}`);
return p.exec();
});
console.error(` PIPE p50=${results["Pipeline x10 SETs"].p50.toFixed(2)} p99=${results["Pipeline x10 SETs"].p99.toFixed(2)}`);
results["Rate-limit (INCR+EXPIRE pipelined)"] = await runSeq((i) => {
const p = client.pipeline();
p.incr("bench:rl:" + (i % 50));
p.expire("bench:rl:" + (i % 50), 60);
return p.exec();
});
console.error(` RL p50=${results["Rate-limit (INCR+EXPIRE pipelined)"].p50.toFixed(2)} p99=${results["Rate-limit (INCR+EXPIRE pipelined)"].p99.toFixed(2)}`);
const conc = await runConcurrentGets(client, CONCURRENT_N);
results[`${CONCURRENT_N} concurrent GETs`] = conc;
console.error(` ${CONCURRENT_N}xGET ${Math.round(conc.opsPerSec).toLocaleString()} ops/sec`);
await client.quit();
return { name, urlMasked: maskUrl(url), caFile: caFile || null, results };
}
function fetchImds(path) {
try {
const token = execSync(`curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 60"`, { timeout: 2000 }).toString().trim();
return execSync(`curl -s -H "X-aws-ec2-metadata-token: ${token}" "http://169.254.169.254/latest/meta-data/${path}"`, { timeout: 2000 }).toString().trim();
} catch {
return null;
}
}
const env = {
timestamp: new Date().toISOString(),
hostname: hostname(),
node: process.version,
ioredis: JSON.parse(readFileSync("./package.json")).dependencies.ioredis,
platform: process.platform,
arch: process.arch,
ec2: {
instanceId: fetchImds("instance-id"),
instanceType: fetchImds("instance-type"),
availabilityZone: fetchImds("placement/availability-zone"),
region: fetchImds("placement/region"),
ami: fetchImds("ami-id"),
},
bench: {
sequentialOpsPerTest: N,
warmupOpsPerTest: WARMUP,
concurrentGets: CONCURRENT_N,
timingSource: "process.hrtime.bigint()",
percentileMethod: "sort ascending, floor(p*n) index",
},
};
console.error("\n== environment ==");
console.error(JSON.stringify(env, null, 2));
const out = [];
for (const t of TARGETS) {
if (!t.url) {
console.error(`Skipping ${t.name} - URL not set`);
continue;
}
const r = await benchTarget(t);
if (r) out.push(r);
}
const result = { env, targets: out };
process.stdout.write(JSON.stringify(result, null, 2));
provider az operation metric value unit
Upstash TCP (TLS) us-east-1a GET mean 1.5659107035000002 ms
Upstash TCP (TLS) us-east-1a GET p50 1.534635 ms
Upstash TCP (TLS) us-east-1a GET p90 1.724723 ms
Upstash TCP (TLS) us-east-1a GET p95 1.796495 ms
Upstash TCP (TLS) us-east-1a GET p99 2.300393 ms
Upstash TCP (TLS) us-east-1a GET min 1.19677 ms
Upstash TCP (TLS) us-east-1a GET max 4.358546 ms
Upstash TCP (TLS) us-east-1a SET mean 1.5401254030000004 ms
Upstash TCP (TLS) us-east-1a SET p50 1.501779 ms
Upstash TCP (TLS) us-east-1a SET p90 1.683799 ms
Upstash TCP (TLS) us-east-1a SET p95 1.750327 ms
Upstash TCP (TLS) us-east-1a SET p99 2.072641 ms
Upstash TCP (TLS) us-east-1a SET min 1.191428 ms
Upstash TCP (TLS) us-east-1a SET max 16.981845 ms
Upstash TCP (TLS) us-east-1a INCR mean 1.5173188934999997 ms
Upstash TCP (TLS) us-east-1a INCR p50 1.49069 ms
Upstash TCP (TLS) us-east-1a INCR p90 1.667101 ms
Upstash TCP (TLS) us-east-1a INCR p95 1.729445 ms
Upstash TCP (TLS) us-east-1a INCR p99 2.240684 ms
Upstash TCP (TLS) us-east-1a INCR min 1.196357 ms
Upstash TCP (TLS) us-east-1a INCR max 7.872755 ms
Upstash TCP (TLS) us-east-1a Pipeline x10 SETs mean 1.567786717000003 ms
Upstash TCP (TLS) us-east-1a Pipeline x10 SETs p50 1.534911 ms
Upstash TCP (TLS) us-east-1a Pipeline x10 SETs p90 1.690445 ms
Upstash TCP (TLS) us-east-1a Pipeline x10 SETs p95 1.760115 ms
Upstash TCP (TLS) us-east-1a Pipeline x10 SETs p99 2.541411 ms
Upstash TCP (TLS) us-east-1a Pipeline x10 SETs min 1.242681 ms
Upstash TCP (TLS) us-east-1a Pipeline x10 SETs max 5.549387 ms
Upstash TCP (TLS) us-east-1a Rate-limit (INCR+EXPIRE pipelined) mean 1.5108684785000002 ms
Upstash TCP (TLS) us-east-1a Rate-limit (INCR+EXPIRE pipelined) p50 1.493482 ms
Upstash TCP (TLS) us-east-1a Rate-limit (INCR+EXPIRE pipelined) p90 1.659606 ms
Upstash TCP (TLS) us-east-1a Rate-limit (INCR+EXPIRE pipelined) p95 1.718109 ms
Upstash TCP (TLS) us-east-1a Rate-limit (INCR+EXPIRE pipelined) p99 1.845852 ms
Upstash TCP (TLS) us-east-1a Rate-limit (INCR+EXPIRE pipelined) min 1.194689 ms
Upstash TCP (TLS) us-east-1a Rate-limit (INCR+EXPIRE pipelined) max 5.771178 ms
Upstash TCP (TLS) us-east-1a 200 concurrent GETs opsPerSec 48458.01742744139 ops_per_sec
Upstash TCP (TLS) us-east-1b GET mean 0.7726901055 ms
Upstash TCP (TLS) us-east-1b GET p50 0.780478 ms
Upstash TCP (TLS) us-east-1b GET p90 0.969097 ms
Upstash TCP (TLS) us-east-1b GET p95 1.049175 ms
Upstash TCP (TLS) us-east-1b GET p99 1.220454 ms
Upstash TCP (TLS) us-east-1b GET min 0.551042 ms
Upstash TCP (TLS) us-east-1b GET max 3.374679 ms
Upstash TCP (TLS) us-east-1b SET mean 0.8081853560000009 ms
Upstash TCP (TLS) us-east-1b SET p50 0.804737 ms
Upstash TCP (TLS) us-east-1b SET p90 1.020289 ms
Upstash TCP (TLS) us-east-1b SET p95 1.095631 ms
Upstash TCP (TLS) us-east-1b SET p99 1.288832 ms
Upstash TCP (TLS) us-east-1b SET min 0.540968 ms
Upstash TCP (TLS) us-east-1b SET max 7.993235 ms
Upstash TCP (TLS) us-east-1b INCR mean 0.7522189495000008 ms
Upstash TCP (TLS) us-east-1b INCR p50 0.760634 ms
Upstash TCP (TLS) us-east-1b INCR p90 0.907958 ms
Upstash TCP (TLS) us-east-1b INCR p95 0.9708 ms
Upstash TCP (TLS) us-east-1b INCR p99 1.142317 ms
Upstash TCP (TLS) us-east-1b INCR min 0.537593 ms
Upstash TCP (TLS) us-east-1b INCR max 16.816216 ms
Upstash TCP (TLS) us-east-1b Pipeline x10 SETs mean 0.8596522119999986 ms
Upstash TCP (TLS) us-east-1b Pipeline x10 SETs p50 0.858831 ms
Upstash TCP (TLS) us-east-1b Pipeline x10 SETs p90 1.045816 ms
Upstash TCP (TLS) us-east-1b Pipeline x10 SETs p95 1.113608 ms
Upstash TCP (TLS) us-east-1b Pipeline x10 SETs p99 1.288664 ms
Upstash TCP (TLS) us-east-1b Pipeline x10 SETs min 0.588726 ms
Upstash TCP (TLS) us-east-1b Pipeline x10 SETs max 5.562902 ms
Upstash TCP (TLS) us-east-1b Rate-limit (INCR+EXPIRE pipelined) mean 0.7643868425 ms
Upstash TCP (TLS) us-east-1b Rate-limit (INCR+EXPIRE pipelined) p50 0.756776 ms
Upstash TCP (TLS) us-east-1b Rate-limit (INCR+EXPIRE pipelined) p90 0.951644 ms
Upstash TCP (TLS) us-east-1b Rate-limit (INCR+EXPIRE pipelined) p95 1.022313 ms
Upstash TCP (TLS) us-east-1b Rate-limit (INCR+EXPIRE pipelined) p99 1.205087 ms
Upstash TCP (TLS) us-east-1b Rate-limit (INCR+EXPIRE pipelined) min 0.552861 ms
Upstash TCP (TLS) us-east-1b Rate-limit (INCR+EXPIRE pipelined) max 5.540413 ms
Upstash TCP (TLS) us-east-1b 200 concurrent GETs opsPerSec 108162.65716710103 ops_per_sec
Upstash TCP (TLS) us-east-1c GET mean 1.3030677684999983 ms
Upstash TCP (TLS) us-east-1c GET p50 1.276885 ms
Upstash TCP (TLS) us-east-1c GET p90 1.461435 ms
Upstash TCP (TLS) us-east-1c GET p95 1.542431 ms
Upstash TCP (TLS) us-east-1c GET p99 2.061719 ms
Upstash TCP (TLS) us-east-1c GET min 0.936004 ms
Upstash TCP (TLS) us-east-1c GET max 3.972564 ms
Upstash TCP (TLS) us-east-1c SET mean 1.2842791139999994 ms
Upstash TCP (TLS) us-east-1c SET p50 1.255966 ms
Upstash TCP (TLS) us-east-1c SET p90 1.43897 ms
Upstash TCP (TLS) us-east-1c SET p95 1.488676 ms
Upstash TCP (TLS) us-east-1c SET p99 1.834441 ms
Upstash TCP (TLS) us-east-1c SET min 0.9318 ms
Upstash TCP (TLS) us-east-1c SET max 17.658624 ms
Upstash TCP (TLS) us-east-1c INCR mean 1.2304029259999993 ms
Upstash TCP (TLS) us-east-1c INCR p50 1.207215 ms
Upstash TCP (TLS) us-east-1c INCR p90 1.360204 ms
Upstash TCP (TLS) us-east-1c INCR p95 1.441386 ms
Upstash TCP (TLS) us-east-1c INCR p99 1.84122 ms
Upstash TCP (TLS) us-east-1c INCR min 0.92448 ms
Upstash TCP (TLS) us-east-1c INCR max 4.627419 ms
Upstash TCP (TLS) us-east-1c Pipeline x10 SETs mean 1.3183703704999998 ms
Upstash TCP (TLS) us-east-1c Pipeline x10 SETs p50 1.284067 ms
Upstash TCP (TLS) us-east-1c Pipeline x10 SETs p90 1.478561 ms
Upstash TCP (TLS) us-east-1c Pipeline x10 SETs p95 1.544635 ms
Upstash TCP (TLS) us-east-1c Pipeline x10 SETs p99 2.049471 ms
Upstash TCP (TLS) us-east-1c Pipeline x10 SETs min 0.979462 ms
Upstash TCP (TLS) us-east-1c Pipeline x10 SETs max 6.138561 ms
Upstash TCP (TLS) us-east-1c Rate-limit (INCR+EXPIRE pipelined) mean 1.2872097429999996 ms
Upstash TCP (TLS) us-east-1c Rate-limit (INCR+EXPIRE pipelined) p50 1.258433 ms
Upstash TCP (TLS) us-east-1c Rate-limit (INCR+EXPIRE pipelined) p90 1.431819 ms
Upstash TCP (TLS) us-east-1c Rate-limit (INCR+EXPIRE pipelined) p95 1.504324 ms
Upstash TCP (TLS) us-east-1c Rate-limit (INCR+EXPIRE pipelined) p99 1.935331 ms
Upstash TCP (TLS) us-east-1c Rate-limit (INCR+EXPIRE pipelined) min 0.944562 ms
Upstash TCP (TLS) us-east-1c Rate-limit (INCR+EXPIRE pipelined) max 5.008931 ms
Upstash TCP (TLS) us-east-1c 200 concurrent GETs opsPerSec 74910.828023092 ops_per_sec
Redis Cloud TCP (TLS, private CA) us-east-1a GET mean 1.4348608439999977 ms
Redis Cloud TCP (TLS, private CA) us-east-1a GET p50 1.400442 ms
Redis Cloud TCP (TLS, private CA) us-east-1a GET p90 1.519361 ms
Redis Cloud TCP (TLS, private CA) us-east-1a GET p95 1.626881 ms
Redis Cloud TCP (TLS, private CA) us-east-1a GET p99 3.01889 ms
Redis Cloud TCP (TLS, private CA) us-east-1a GET min 1.139291 ms
Redis Cloud TCP (TLS, private CA) us-east-1a GET max 6.611152 ms
Redis Cloud TCP (TLS, private CA) us-east-1a SET mean 1.400525312500001 ms
Redis Cloud TCP (TLS, private CA) us-east-1a SET p50 1.390777 ms
Redis Cloud TCP (TLS, private CA) us-east-1a SET p90 1.492275 ms
Redis Cloud TCP (TLS, private CA) us-east-1a SET p95 1.554658 ms
Redis Cloud TCP (TLS, private CA) us-east-1a SET p99 1.797681 ms
Redis Cloud TCP (TLS, private CA) us-east-1a SET min 1.13967 ms
Redis Cloud TCP (TLS, private CA) us-east-1a SET max 4.433393 ms
Redis Cloud TCP (TLS, private CA) us-east-1a INCR mean 1.3765685174999984 ms
Redis Cloud TCP (TLS, private CA) us-east-1a INCR p50 1.381131 ms
Redis Cloud TCP (TLS, private CA) us-east-1a INCR p90 1.44709 ms
Redis Cloud TCP (TLS, private CA) us-east-1a INCR p95 1.474391 ms
Redis Cloud TCP (TLS, private CA) us-east-1a INCR p99 1.612475 ms
Redis Cloud TCP (TLS, private CA) us-east-1a INCR min 1.13858 ms
Redis Cloud TCP (TLS, private CA) us-east-1a INCR max 5.56051 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Pipeline x10 SETs mean 1.4587860019999999 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Pipeline x10 SETs p50 1.445423 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Pipeline x10 SETs p90 1.546781 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Pipeline x10 SETs p95 1.608775 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Pipeline x10 SETs p99 1.921938 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Pipeline x10 SETs min 1.175314 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Pipeline x10 SETs max 6.27277 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Rate-limit (INCR+EXPIRE pipelined) mean 1.4111172469999984 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Rate-limit (INCR+EXPIRE pipelined) p50 1.41075 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Rate-limit (INCR+EXPIRE pipelined) p90 1.483386 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Rate-limit (INCR+EXPIRE pipelined) p95 1.521382 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Rate-limit (INCR+EXPIRE pipelined) p99 1.665736 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Rate-limit (INCR+EXPIRE pipelined) min 1.155519 ms
Redis Cloud TCP (TLS, private CA) us-east-1a Rate-limit (INCR+EXPIRE pipelined) max 5.727436 ms
Redis Cloud TCP (TLS, private CA) us-east-1a 200 concurrent GETs opsPerSec 89948.80563727154 ops_per_sec
Redis Cloud TCP (TLS, private CA) us-east-1b GET mean 0.5772737510000009 ms
Redis Cloud TCP (TLS, private CA) us-east-1b GET p50 0.48039 ms
Redis Cloud TCP (TLS, private CA) us-east-1b GET p90 0.736123 ms
Redis Cloud TCP (TLS, private CA) us-east-1b GET p95 0.868332 ms
Redis Cloud TCP (TLS, private CA) us-east-1b GET p99 1.845415 ms
Redis Cloud TCP (TLS, private CA) us-east-1b GET min 0.427476 ms
Redis Cloud TCP (TLS, private CA) us-east-1b GET max 4.648026 ms
Redis Cloud TCP (TLS, private CA) us-east-1b SET mean 0.5034071999999998 ms
Redis Cloud TCP (TLS, private CA) us-east-1b SET p50 0.457331 ms
Redis Cloud TCP (TLS, private CA) us-east-1b SET p90 0.663767 ms
Redis Cloud TCP (TLS, private CA) us-east-1b SET p95 0.694339 ms
Redis Cloud TCP (TLS, private CA) us-east-1b SET p99 0.845701 ms
Redis Cloud TCP (TLS, private CA) us-east-1b SET min 0.422982 ms
Redis Cloud TCP (TLS, private CA) us-east-1b SET max 1.726755 ms
Redis Cloud TCP (TLS, private CA) us-east-1b INCR mean 0.5231509425000003 ms
Redis Cloud TCP (TLS, private CA) us-east-1b INCR p50 0.469546 ms
Redis Cloud TCP (TLS, private CA) us-east-1b INCR p90 0.683251 ms
Redis Cloud TCP (TLS, private CA) us-east-1b INCR p95 0.72601 ms
Redis Cloud TCP (TLS, private CA) us-east-1b INCR p99 0.894954 ms
Redis Cloud TCP (TLS, private CA) us-east-1b INCR min 0.425149 ms
Redis Cloud TCP (TLS, private CA) us-east-1b INCR max 1.711044 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Pipeline x10 SETs mean 0.5521164945 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Pipeline x10 SETs p50 0.489303 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Pipeline x10 SETs p90 0.723867 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Pipeline x10 SETs p95 0.75624 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Pipeline x10 SETs p99 0.8998 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Pipeline x10 SETs min 0.452293 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Pipeline x10 SETs max 5.16487 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Rate-limit (INCR+EXPIRE pipelined) mean 0.568319789499999 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Rate-limit (INCR+EXPIRE pipelined) p50 0.500765 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Rate-limit (INCR+EXPIRE pipelined) p90 0.734689 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Rate-limit (INCR+EXPIRE pipelined) p95 0.777441 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Rate-limit (INCR+EXPIRE pipelined) p99 1.088471 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Rate-limit (INCR+EXPIRE pipelined) min 0.435591 ms
Redis Cloud TCP (TLS, private CA) us-east-1b Rate-limit (INCR+EXPIRE pipelined) max 4.758503 ms
Redis Cloud TCP (TLS, private CA) us-east-1b 200 concurrent GETs opsPerSec 132651.68056414108 ops_per_sec
Redis Cloud TCP (TLS, private CA) us-east-1c GET mean 1.0777287089999992 ms
Redis Cloud TCP (TLS, private CA) us-east-1c GET p50 1.073798 ms
Redis Cloud TCP (TLS, private CA) us-east-1c GET p90 1.168912 ms
Redis Cloud TCP (TLS, private CA) us-east-1c GET p95 1.237299 ms
Redis Cloud TCP (TLS, private CA) us-east-1c GET p99 1.365914 ms
Redis Cloud TCP (TLS, private CA) us-east-1c GET min 0.822677 ms
Redis Cloud TCP (TLS, private CA) us-east-1c GET max 3.950815 ms
Redis Cloud TCP (TLS, private CA) us-east-1c SET mean 1.1187462750000008 ms
Redis Cloud TCP (TLS, private CA) us-east-1c SET p50 1.076428 ms
Redis Cloud TCP (TLS, private CA) us-east-1c SET p90 1.194439 ms
Redis Cloud TCP (TLS, private CA) us-east-1c SET p95 1.30948 ms
Redis Cloud TCP (TLS, private CA) us-east-1c SET p99 2.946161 ms
Redis Cloud TCP (TLS, private CA) us-east-1c SET min 0.825613 ms
Redis Cloud TCP (TLS, private CA) us-east-1c SET max 6.648188 ms
Redis Cloud TCP (TLS, private CA) us-east-1c INCR mean 1.0227721109999992 ms
Redis Cloud TCP (TLS, private CA) us-east-1c INCR p50 1.041696 ms
Redis Cloud TCP (TLS, private CA) us-east-1c INCR p90 1.104013 ms
Redis Cloud TCP (TLS, private CA) us-east-1c INCR p95 1.144499 ms
Redis Cloud TCP (TLS, private CA) us-east-1c INCR p99 1.268847 ms
Redis Cloud TCP (TLS, private CA) us-east-1c INCR min 0.822094 ms
Redis Cloud TCP (TLS, private CA) us-east-1c INCR max 6.129269 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Pipeline x10 SETs mean 1.0943942160000002 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Pipeline x10 SETs p50 1.095316 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Pipeline x10 SETs p90 1.178153 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Pipeline x10 SETs p95 1.240434 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Pipeline x10 SETs p99 1.575164 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Pipeline x10 SETs min 0.843214 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Pipeline x10 SETs max 5.217483 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Rate-limit (INCR+EXPIRE pipelined) mean 1.046473723 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Rate-limit (INCR+EXPIRE pipelined) p50 1.063326 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Rate-limit (INCR+EXPIRE pipelined) p90 1.125498 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Rate-limit (INCR+EXPIRE pipelined) p95 1.165217 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Rate-limit (INCR+EXPIRE pipelined) p99 1.285833 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Rate-limit (INCR+EXPIRE pipelined) min 0.821651 ms
Redis Cloud TCP (TLS, private CA) us-east-1c Rate-limit (INCR+EXPIRE pipelined) max 7.139597 ms
Redis Cloud TCP (TLS, private CA) us-east-1c 200 concurrent GETs opsPerSec 134348.92161479342 ops_per_sec

Results Summary — Upstash TCP vs Redis Cloud TCP, TLS on both sides, us-east-1

Run timestamp: 2026-05-19 (~12:51 UTC) Client: c7i.large EC2, Node 22.22.3, ioredis 5.7.0 TLS: enabled on both providers

  • Upstash: publicly-trusted CA (zero client config)
  • Redis Cloud: private CA, tls: { ca: fs.readFileSync('redis_ca.pem') } passed to ioredis Sample size: 2000 sequential ops per workload, 200 warmup ops, 1 client per provider per run

p50 latency by AZ (ms)

Workload Provider us-east-1a us-east-1b us-east-1c
GET Upstash 1.53 0.78 1.28
GET Redis Cloud 1.40 0.48 1.07
SET Upstash 1.50 0.80 1.26
SET Redis Cloud 1.39 0.46 1.08
INCR Upstash 1.49 0.76 1.21
INCR Redis Cloud 1.38 0.47 1.04
Pipeline x10 SETs Upstash 1.53 0.86 1.28
Pipeline x10 SETs Redis Cloud 1.45 0.49 1.10
Rate-limit (INCR+EXPIRE pipelined) Upstash 1.49 0.76 1.26
Rate-limit (INCR+EXPIRE pipelined) Redis Cloud 1.41 0.50 1.06

p99 latency by AZ (ms)

Workload Provider us-east-1a us-east-1b us-east-1c
GET Upstash 2.30 1.22 2.06
GET Redis Cloud 3.02 1.85 1.37
SET Upstash 2.07 1.29 1.83
SET Redis Cloud 1.80 0.85 2.95
INCR Upstash 2.24 1.14 1.84
INCR Redis Cloud 1.61 0.89 1.27
Pipeline x10 SETs Upstash 2.54 1.29 2.05
Pipeline x10 SETs Redis Cloud 1.92 0.90 1.58
Rate-limit (INCR+EXPIRE pipelined) Upstash 1.85 1.21 1.94
Rate-limit (INCR+EXPIRE pipelined) Redis Cloud 1.67 1.09 1.29

200 concurrent GETs through 1 connection (ops/sec)

Provider us-east-1a us-east-1b us-east-1c
Upstash 48,458 108,163 74,911
Redis Cloud 89,949 132,652 134,349

Median across the 3 AZs (single-number-per-cell summary)

Workload Upstash p50 Upstash p99 Redis Cloud p50 Redis Cloud p99
GET 1.28 ms 2.06 ms 1.07 ms 1.85 ms
SET 1.26 ms 1.83 ms 1.08 ms 1.80 ms
INCR 1.21 ms 1.84 ms 1.04 ms 1.27 ms
Pipeline x10 SETs 1.28 ms 2.05 ms 1.10 ms 1.58 ms
Rate-limit (INCR+EXPIRE pipelined) 1.26 ms 1.85 ms 1.06 ms 1.29 ms
200 concurrent GETs 74,911 ops/sec 132,652 ops/sec
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment