ประมาณ 2 สัปดาห์ก่อน เราเปรียบเทียบ performance และ cost ของ Cloudflare KV และ Upstash Redis คราวนี้เราจะดู Deno KV key-value store native ของ Deno ที่รันบน global edge network ของพวกเขา
Deno KV คล้าย Upstash Redis ใน architecture ทั้งคู่มี primary region สำหรับ writes แล้ว replicate ไป regions อื่นๆ Reads served จาก region ใกล้ client มากที่สุด มีความต่างมากใน features เพราะ Redis มี features มากกว่า KV แต่เราจะโฟกัสแค่ simple reads และ writes
Benchmark 2 แบบ บน Deno Deploy ทั้งคู่ KV store และ Redis เปิด read regions ทั้งหมด:
- Invoke จาก 20 regions รอบโลกด้วย planetfall.io
- Invoke จาก single region ด้วย load สูงกว่ามาก
จากนั้นเปรียบเทียบ results และพูดถึง trade-offs และ pricing
The Benchmark
Setup เหมือน Cloudflare แค่ update ใช้ Deno KV:
- 1000 keys
- 4 KB - 64 KB data size (random)
- 60s TTL ทุก keys
- 20 regions invoke function
- ~10 requests per second
Keyspace เล็ก เพื่อให้ได้ cache hits โดยไม่ต้อง crank RPS สูง
Code
Function เรียบง่าย: read จาก Redis, read จาก KV, return latencies
app.get("/test", async (c) => {
const key = Math.floor(Math.random() * 1_000).toString()
const minValueSize = 4 * 1024
const maxValueSize = 64 * 1024
const data = randomBytes(minValueSize, maxValueSize)
const ttlSeconds = 60
const beforeRedis = performance.now()
const redisResponse = await fetch(Deno.env.get("UPSTASH_REDIS_REST_URL")!, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${Deno.env.get("UPSTASH_REDIS_REST_TOKEN")}`,
},
body: JSON.stringify(["GET", key])
})
const redisLatency = performance.now() - beforeRedis
if (!redisResponse) {
await fetch(Deno.env.get("UPSTASH_REDIS_REST_URL")!, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${Deno.env.get("UPSTASH_REDIS_REST_TOKEN")}`,
},
body: JSON.stringify(["SET", key, data, "EX", ttlSeconds])
})
}
const kv = await Deno.openKv();
const beforeKV = performance.now()
const kvResponse = await kv.get([key])
const kvLatency = performance.now() - beforeKV
if (!kvResponse.value) {
const setRes = await kv.set([key], data, { expireIn: ttlSeconds })
console.log({ setRes })
}
return c.json({ redisLatency, kvLatency })
});
Results - Global Latency
หลัง 30 นาที ผลลัพธ์ (latency วัดจาก function บน Deno Deploy ไป store ไม่รวม network roundtrips invoke function):
Click image for full size
| Deno KV | Upstash Redis | |
|---|---|---|
| P90 | 265ms | 76ms |
| P99 | 494ms | 94ms |
Deno KV ช้ากว่ามากตอน read ข้อมูล คิดว่าเขาอาจไม่มี read regions แจกแจงพอ ณ เวลา benchmark มี gpc-us-east4, gpc-asia-southeast1, gcp-europe-west3, gcp-southamerica-east1 และ gcp-us-west2
อาจมี requests มากต้อง cross regions ดึงข้อมูล ทำ latency สูง กำจัดข้อได้เปรียบของ Deno ที่ควบคุม compute และ storage ใน cloud เดียวกัน Upstash รันบน AWS requests จาก Deno ไป Redis ข้าม cloud provider borders
Single Region
ทดสอบ theory: invoke จาก single location (home) ทุก requests ผ่าน Frankfurt ทั้งคู่มี read replica ที่นั่น gcp-europe-west3 และ eu-central-1 ตามลำดับ
Click image for full size
ทั้งคู่เร็วกว่ามากใน scenario นี้ แต่ Deno KV ยังช้ากว่า Upstash Redis Latencies สำหรับ single region (delta จาก global latency ในวงเล็บ):
| Deno KV | Upstash Redis | |
|---|---|---|
| P90 | 132ms (-133) | 16ms (-60) |
| P99 | 154ms (-340) | 26ms (-68) |
154 ms ดีกว่า 494 ms แต่ assume traffic มาจาก single region ซึ่งขัดกับ global edge network idea ถ้า run global API traffic มาจากทั่วโลก ทุก request ที่ต้อง access KV จะช้าลง
Pricing
Deno และ Upstash bill ตาม usage ทั้งคู่ free tiers ดี ลองได้ฟรี
| Deno KV | Upstash Redis | |
|---|---|---|
| Flat Cost | $20/mo (เพิ่ม read regions) | FREE |
| Storage | $0.50 / GB | $0.25 / GB |
| Reads | $1 / Million / 4kb | $2 / Million (regardless of size) |
| Writes | $2.50 / Million / 1kb | $2 / Million (regardless of size) |
| Bandwidth | $0.50 / GB | $0.03 / GB |
ความต่างหลัก: Deno pricing ไม่ transparent ต้องรู้ request size เพื่อคำนวณ cost Upstash ทุก requests bill เท่ากัน Default Upstash อ่าน/เขียนได้ถึง 1MB/request อนุญาตเพิ่มได้ด้วย flat fee
Bottom line: ถ้าอ่านมากกว่า 8kb/request Upstash น่าจะถูกกว่า
สรุป
Deno KV รู้สึกดีเพราะ same platform ไม่ต้อง manage separate account ไม่ต้อง extra setup แต่ performance และ cost ไม่อยู่ระดับ Upstash จำกัดในสิ่งที่ทำได้ (set/get เป็น common operations แต่นี่ไม่ใช่ทั้งหมดของ Redis ดู examples ของเราสำหรับ ideas และ usecases)
มา say hi และถามคำถามใน Discord หรือ X ได้เลย