karawaci.kode

2026-08-08 · 8 min

Redis vs Upstash untuk Edge Caching: Latency Jakarta ke Edge Region

Bulan lalu saya migrasi layer caching sebuah API e-commerce klien dari Redis self-hosted di Hetzner ke Upstash, karena mereka pindah ke Cloudflare Workers. Pertanyaannya simpel: apakah latency-nya masih acceptable dari edge, dan berapa biaya ekstranya?

Konteks: mengapa edge caching berbeda dari caching konvensional

Di arsitektur server tradisional, Redis self-hosted hidup di network yang sama dengan application server. Round-trip 1-3ms dari app ke Redis adalah angka yang bisa dicapai dengan mudah. Problem baru muncul ketika application-nya pindah ke edge runtime seperti Cloudflare Workers, Vercel Edge Functions, atau Deno Deploy.

Edge runtime dijalankan di puluhan data center sekaligus — Jakarta, Singapore, Tokyo, Sydney — tapi Redis Anda tetap duduk di satu lokasi. Kalau Redis-nya di Hetzner Singapore dan Workers-nya sedang dieksekusi di node Cloudflare Jakarta (CGK), round-trip Jakarta → Singapore → Jakarta ditambahkan ke setiap cache hit. Anda bayar biaya latency jaringan yang tadinya tidak ada.

Upstash hadir dengan janji spesifik: Redis-compatible store yang bisa diakses via HTTP/REST, serverless-friendly, dan (dengan Global Database) punya read replica di banyak region. Pertanyaannya adalah seberapa besar gap latency-nya dibanding self-hosted, dan apakah pengoperasiannya cukup sederhana untuk menukar trade-off itu.

Setup pengujian

Saya mengukur dua konfigurasi dari klien Jakarta yang menjalankan API product catalog di Cloudflare Workers:

Konfigurasi A — Redis self-hosted: Redis 7.4 di Hetzner Cloud Singapore (cx21, 2 vCPU / 4 GB), diakses via ioredis TCP dari Workers menggunakan Cloudflare Tunnel untuk tunneling TCP.

Konfigurasi B — Upstash: Upstash Redis single region ap-southeast-1 (Singapore), diakses via @upstash/redis yang menggunakan REST API.

Metrik yang diukur: p50, p95, p99 untuk operasi GET dan SET sederhana (value ~1 KB JSON), diambil dari real traffic selama 24 jam.

Kode: Upstash di Cloudflare Workers

Integrasi Upstash sangat minim boilerplate. Install dependency:

npm install @upstash/redis

Inisialisasi client di Worker:

// src/lib/cache.ts
import { Redis } from '@upstash/redis/cloudflare';

export const redis = new Redis({
  url: env.UPSTASH_REDIS_REST_URL,
  token: env.UPSTASH_REDIS_REST_TOKEN,
});

export async function getCached<T>(
  key: string,
  fetcher: () => Promise<T>,
  ttlSeconds = 300,
): Promise<T> {
  const cached = await redis.get<T>(key);
  if (cached !== null) return cached;

  const fresh = await fetcher();
  await redis.set(key, fresh, { ex: ttlSeconds });
  return fresh;
}

Penggunaan di handler:

// src/handlers/products.ts
export async function handleGetProduct(
  productId: string,
  env: Env,
): Promise<Response> {
  const data = await getCached(
    `product:${productId}`,
    () => fetchProductFromDB(productId, env),
    600, // 10 menit TTL
  );

  return Response.json(data);
}

Tidak ada connection pooling, tidak ada TCP keepalive, tidak ada konfigurasi Sentinel. @upstash/redis di-import sebagai modul biasa dan Workers menangani isolasi per-request secara otomatis.

Angka latency nyata

Hasil pengukuran dari traffic production selama 24 jam, Workers region Singapore (SIN):

OperasiRedis self-hosted (p50 / p95 / p99)Upstash REST (p50 / p95 / p99)
GET hit6ms / 12ms / 18ms22ms / 38ms / 52ms
SET7ms / 14ms / 21ms24ms / 41ms / 58ms
GET miss + DB45ms / 90ms / 140ms60ms / 105ms / 160ms

Redis self-hosted unggul cukup signifikan di angka p50 — sekitar 3-4x lebih cepat untuk operasi tunggal. Tapi konteksnya penting: ini diukur dari Workers node di Singapore yang memang dekat dengan Hetzner Singapore. Dari Workers node di Jakarta atau Sydney, gap-nya berbeda.

Saya juga mengukur dari node CGK (Jakarta):

OperasiRedis self-hosted (p50)Upstash (p50)
GET hit28ms26ms
SET30ms28ms

Menariknya, dari Jakarta gap-nya hampir tidak ada. Kenapa? Karena dari Jakarta, TCP ke Hetzner Singapore juga butuh 18-22ms round-trip jaringan, ditambah overhead protokol. Upstash dengan HTTP/REST melewati path Cloudflare internal yang lebih dioptimasi dari node Jakarta ke data center Singapore mereka.

Overhead HTTP vs TCP

Perbedaan mendasar antara ioredis dan @upstash/redis adalah protokol transport. ioredis menggunakan binary RESP protocol di atas TCP dengan connection persistent — overhead per command sangat kecil setelah koneksi terbentuk. Upstash menggunakan HTTP/2 REST — setiap command adalah satu HTTP request.

Di serverless/edge environment, “persistent connection” itu hampir tidak ada — setiap invocation Workers praktis fresh. Jadi keunggulan TCP persistent connection Redis tidak berlaku di sini. Itulah mengapa gap di production edge jauh lebih kecil dari yang terlihat di benchmark local-to-server.

Tapi ada satu biaya tersembunyi Upstash yang perlu dicatat: pipeline. Kalau satu request handler butuh 5 operasi Redis sekaligus, dengan ioredis Anda bisa pipeline semuanya dalam satu round-trip:

// ioredis pipeline — 1 round-trip untuk 3 operasi
const pipeline = redis.pipeline();
pipeline.get('key:1');
pipeline.get('key:2');
pipeline.get('key:3');
const results = await pipeline.exec();

Dengan Upstash, pipeline tetap tersedia tapi tetap satu HTTP request per exec:

// Upstash pipeline — 1 HTTP request, masih lebih lambat dari TCP pipeline
const p = redis.pipeline();
p.get('key:1');
p.get('key:2');
p.get('key:3');
const results = await p.exec();

Untuk handler yang butuh banyak operasi Redis berurutan, biaya latency Upstash mulai terasa lebih nyata. Kalau desain handler Anda butuh 8-10 Redis commands per request, pertimbangkan refactor caching key agar bisa dilakukan dalam satu MGET.

Biaya: bukan hanya latency

Hetzner cx21 di Singapore biayanya sekitar €4.5/bulan flat. Upstash pricing untuk plan Pro:

  • $0.2 per 100.000 command
  • $0.25 per GB bandwidth
  • Free tier: 10.000 command/hari

Untuk klien Jakarta yang traffic-nya sekitar 800.000 command/hari di peak, kalkulasi bulanannya:

800.000 cmd/hari × 30 hari = 24.000.000 cmd/bulan
24.000.000 / 100.000 × $0.2 = $48/bulan

Dibanding Hetzner $5/bulan, itu 9x lebih mahal. Tapi Hetzner butuh konfigurasi, monitoring, backup, update Redis — yang untuk tim kecil nilainya tidak nol. Pada akhirnya saya rekomendasikan klien itu tetap di Upstash karena mereka tim 2 orang dan operational overhead Redis jauh lebih mahal dari selisih biaya itu.

Untuk tim yang lebih besar atau traffic lebih tinggi, kalkulasinya bisa berbalik.

Kapan pilih Upstash, kapan pilih self-hosted

Pilih Upstash kalau:

  • Runtime-nya serverless atau edge (Workers, Vercel Edge, Deno Deploy) — TCP persistent tidak bisa dimanfaatkan
  • Tim kecil yang tidak mau urus ops Redis
  • Traffic belum cukup tinggi untuk biaya per-command jadi masalah (di bawah ~200.000 command/hari)
  • Butuh multi-region read replica dengan setup minimal — aktifkan Global Database selesai

Pilih Redis self-hosted kalau:

  • Application server-nya masih di VM/container konvensional yang bisa koneksi TCP persisten ke Redis di network yang sama
  • Traffic sangat tinggi dan biaya per-command Upstash melebihi biaya flat VPS
  • Butuh fitur Redis yang tidak tersedia di REST API: pub/sub persistent, keyspace notification, Lua scripting kompleks
  • Ada regulasi data yang melarang penggunaan managed third-party service

Pertimbangkan Redis di Cloudflare Durable Objects atau KV sebagai alternatif ketiga kalau use case-nya caching stateless dan Anda sudah all-in di ekosistem Cloudflare — tapi itu topik tersendiri karena model consistency-nya sangat berbeda.

Verdict

Dari pengukuran ini, kesimpulan saya: untuk edge runtime, Upstash adalah pilihan default yang masuk akal, bukan kompromi. Gap latency dibanding Redis self-hosted praktis menghilang ketika kedua-duanya diukur dari edge node yang sama, karena tidak ada yang bisa memanfaatkan TCP persistent connection.

Yang menentukan bukanlah angka benchmark, melainkan trade-off operasional dan biaya. Upstash menghilangkan seluruh beban ops Redis dengan harga premium per-command. Self-hosted memberikan kontrol penuh dan biaya flat, tapi menambahkan beban tim.

Untuk klien Jakarta itu, keputusan akhirnya: Upstash single region ap-southeast-1 untuk API yang jalan di Workers, Redis self-hosted di Hetzner Singapore untuk internal services yang masih di VM dan butuh throughput tinggi. Dua tool, dua konteks — tidak perlu memilih salah satu untuk segalanya.

Ditulis oleh Reza Pradipta