Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

प्रदर्शन और लागत तुलना: Deno KV बनाम Upstash Redis

लगभग 2 सप्ताह पहले हमने Cloudflare KV और Upstash Redis के प्रदर्शन और लागत की तुलना की थी। इस बार हम Deno KV को देखेंगे, जो उनके वैश्विक एज नेटवर्क में चलने वाला एक Deno-नेटिव कुंजी-मूल्य स्टोर है।

Deno KV अपनी आर्किटेक्चर में Upstash Redis के समान है। दोनों स्टोर में एक प्राथमिक क्षेत्र होता है जहां सभी राइट्स भेजे जाते हैं और फिर अन्य सभी क्षेत्रों में रेप्लिकेट किए जाते हैं। रीड्स को क्लाइंट के निकटतम क्षेत्र से परोसा जाता है। उपलब्ध सुविधाओं में कई अंतर हैं क्योंकि Redis में कई सुविधाएं हैं जो KV में नहीं हैं, लेकिन हम अभी केवल सरल रीड्स और राइट्स पर ध्यान केंद्रित करेंगे।

हम दो अलग-अलग बेंचमार्क आयोजित करेंगे, दोनों Deno Deploy का उपयोग करके कोड चलाने के लिए। दोनों मामलों में, KV स्टोर और Redis में सभी उपलब्ध रीड क्षेत्र सक्षम होंगे।

  1. planetfall.io का उपयोग करके दुनिया भर के 20 क्षेत्रों से आह्वान करना।
  2. बहुत अधिक लोड के साथ एकल क्षेत्र से आह्वान करना।

बाद में, हम परिणामों की तुलना करेंगे और ट्रेड-ऑफ और मूल्य निर्धारण के बारे में बात करेंगे।

बेंचमार्क

यहां सेटअप कैसा दिखता है, यह अनिवार्य रूप से Cloudflare जैसा ही है, बस Deno KV का उपयोग करने के लिए अपडेट किया गया है।

  • 1000 कुंजियाँ
  • 4 KB - 64 KB डेटा आकार (यादृच्छिक)
  • सभी कुंजियों पर 60s TTL
  • फ़ंक्शन को आह्वान करने वाले 20 क्षेत्र
  • ~10 अनुरोध प्रति सेकंड

मैंने एक छोटा कीस्पेस चुना, यह सुनिश्चित करने के लिए कि हमें RPS को बहुत अधिक बढ़ाए बिना कुछ कैश हिट मिल रहे हैं।

कोड

फ़ंक्शन स्वयं बहुत सरल है; यह केवल Redis से पढ़ता है, KV से पढ़ता है, और फिर उन विलंबताओं को बाद में मूल्यांकन के लिए लौटाता है।

main.ts
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, });
});

परिणाम - वैश्विक विलंबता

30 मिनट के बाद, यहां परिणाम हैं। यहां मापी गई विलंबता केवल Deno Deploy पर फ़ंक्शन से स्टोर तक है, जिसमें फ़ंक्शन को आह्वान करने के लिए नेटवर्क राउंडट्रिप्स शामिल नहीं हैं।

प्रदर्शन और लागत तुलना: Deno KV बनाम Upstash Redis

छवि पर क्लिक करें पूर्ण आकार के लिए

Deno KVUpstash Redis
P90265ms76ms
P99494ms94ms

डेटा पढ़ते समय Deno KV काफी धीमा है। मेरा पहला विचार था कि उनके पास शायद दुनिया भर में पर्याप्त रीड क्षेत्र वितरित नहीं हैं। इस बेंचमार्क के समय, उनके पास gpc-us-east4, gpc-asia-southeast1, gcp-europe-west3, gcp-southamerica-east1 और gcp-us-west2 थे।

शायद अनुरोधों की एक महत्वपूर्ण संख्या को डेटा लाने के लिए कई क्षेत्रों में जाने की आवश्यकता होती है, जो उच्च विलंबता की व्याख्या करेगा, प्रभावी रूप से Deno के लाभ को समाप्त कर देता है जो एक ही क्लाउड और संभावित रूप से डेटासेंटर के अंदर कंप्यूट और स्टोरेज दोनों को नियंत्रित करता है। दूसरी ओर Upstash AWS पर चल रहा है और Deno से Redis के सभी अनुरोध क्लाउड प्रोवाइडर सीमाओं के पार जा रहे हैं।

एकल क्षेत्र

इस सिद्धांत का परीक्षण करने के लिए, मैंने एक दूसरा बेंचमार्क चलाया, जहां मैं सिर्फ एक स्थान (मेरा घर) से फ़ंक्शन को आह्वान कर रहा हूं और सभी अनुरोध फ्रैंकफर्ट से गुजरते हैं। Deno KV और Upstash Redis दोनों के पास वहां एक रीड रेप्लिका है gcp-europe-west3 और eu-central-1 क्रमशः GCP और AWS के लिए।

प्रदर्शन और लागत तुलना: Deno KV बनाम Upstash Redis

छवि पर क्लिक करें पूर्ण आकार के लिए

इस परिदृश्य में दोनों सेवाएं बहुत तेज हैं, लेकिन Deno KV अभी भी Upstash Redis से धीमा है। यहां एकल क्षेत्र के लिए विलंबताएं हैं, वैश्विक विलंबता में डेल्टा के साथ कोष्ठक में:

Deno KVUpstash Redis
P90132ms (-133)16ms (-60)
P99154ms (-340)26ms (-68)

154 ms निश्चित रूप से 494 ms से बहुत बेहतर है, लेकिन यह इस धारणा के तहत है कि मेरा सारा ट्रैफिक एक ही क्षेत्र से आ रहा है, जो वैश्विक एज नेटवर्क के पूरे विचार के खिलाफ जाता है। यदि आप एक वैश्विक API चला रहे हैं, तो आपके पास दुनिया भर से ट्रैफिक आएगा और KV में डेटा तक पहुंच की आवश्यकता वाले प्रत्येक अनुरोध को इससे धीमा कर दिया जाएगा।

मूल्य निर्धारण

Deno और Upstash दोनों मुख्य रूप से उपयोग के लिए बिल करते हैं। दोनों के अच्छे मुफ्त टियर हैं, इसलिए आप बिना कुछ भुगतान किए उन्हें आज़मा सकते हैं।

Deno KVUpstash Redis
फ्लैट लागत$20/माह (रीड क्षेत्र जोड़ने के लिए)मुफ्त
स्टोरेज$0.50 / GB$0.25 / GB
रीड्स$1 / मिलियन / 4kb$2 / मिलियन (आकार की परवाह किए बिना)
राइट्स$2.50 / मिलियन / 1kb$2 / मिलियन (आकार की परवाह किए बिना)
बैंडविड्थ$0.50 / GB$0.03 / GB

मुख्य अंतर यह है कि Deno का मूल्य निर्धारण उतना पारदर्शी नहीं है जितना मैंने आशा की थी क्योंकि मुझे यह जानने की आवश्यकता है कि मेरे अनुरोध कितने बड़े होने जा रहे हैं ताकि लागत की गणना की जा सके। यह Upstash के साथ कोई समस्या नहीं है, क्योंकि सभी अनुरोधों का बिल समान रूप से किया जाता है। डिफ़ॉल्ट रूप से Upstash पर आप प्रति अनुरोध 1MB तक पढ़ या लिख सकते हैं और हम आपको एक फ्लैट शुल्क के लिए इसे बढ़ाने की अनुमति देते हैं।

निचला रेखा यह है कि यदि आप प्रति अनुरोध 8kb से अधिक पढ़ रहे हैं, तो Upstash सबसे अधिक सस्ता होने की संभावना है।

निष्कर्ष

Deno KV का उपयोग करना बहुत अच्छा लगता है क्योंकि यह उसी प्लेटफॉर्म पर है; आपको एक अलग खाता प्रबंधित करने की आवश्यकता नहीं है, और इसका उपयोग करने के लिए किसी अतिरिक्त सेटअप की आवश्यकता नहीं है। हालांकि, प्रदर्शन और लागत Upstash के आसपास भी नहीं हैं। यह इस बात में भी सीमित है कि आप इसके साथ क्या कर सकते हैं। मान सेट करना और प्राप्त करना, जबकि सबसे आम ऑपरेशन हैं, वे सब नहीं हैं जो आप Redis के साथ कर सकते हैं। Redis के लिए बहुत सारे विचारों और उपयोग के मामलों को खोजने के लिए हमारे उदाहरण देखें।

हमारे Discord या X पर आकर नमस्ते कहें और इसके बारे में कोई भी प्रश्न पूछें।

  1. CSS3 से वर्ड ब्रेकिंग नियम निर्दिष्ट करना CSS3 से वर्ड ब्रेकिंग नियम निर्दिष्ट करना

    CSS3 में वर्ड ब्रेकिंग नियम निर्दिष्ट करने के लिए, word-break प्रॉपर्टी का उपयोग करें। यह प्रॉपर्टी लाइन ब्रेक करने के लिए उपयोग की जाती है। संभावित मानों में normal, break-all, keep-all, break-word, आदि शामिल हैं।CSS3 का उपयोग करके वर्ड ब्रेकिंग नियम निर्दिष्ट करने का कोड निम्न है -उदाहरण<!DOCTY

  1. Matplotlib में mpl.rcParams का उपयोग करके .ttf फ़ाइल कैसे लोड करें? Matplotlib में mpl.rcParams का उपयोग करके .ttf फ़ाइल कैसे लोड करें?

    Matplotlib में mpl.rcParams का उपयोग करके .ttf फ़ाइल लोड करने के लिए, हम निम्नलिखित चरण अपना सकते हैं -फिगर का आकार सेट करें और सबप्लॉट्स के बीच और आसपास पैडिंग एडजस्ट करें।.ttf फ़ाइल का पथ इनिशियलाइज़ करें।फॉन्ट प्रॉपर्टीज को स्टोर और मैनिपुलेट करने के लिए क्लास का इंस्टेंस प्राप्त करें।फॉन्ट फैमिल

  1. एंड्रॉइड में वॉली एलिमेंट्स को कैसे सॉर्ट करें एंड्रॉइड में वॉली एलिमेंट्स को कैसे सॉर्ट करें

    वॉली (Volley) से प्राप्त डेटा को सॉर्ट करना यह उदाहरण दिखाता है कि Volley लाइब्रेरी से JSON डेटा प्राप्त करके ArrayList में स्टोर करने के बाद उसे कैसे सॉर्ट करें। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में नया प्रोजेक्ट बनाएं। चरण 2: लेआउट फ़ाइल <?xml version=1.0 encoding=utf-8?> <Line