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

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

जब आप Next.js के बारे में सुनते हैं, तो आपका पहला विचार स्टैटिक वेबसाइट या React-चालित फ्रंटएंड हो सकता है। लेकिन यह कहानी का केवल एक हिस्सा है। Next.js पूर्ण-विशेषताओं वाले बैकएंड APIs को भी शक्ति दे सकता है जिन्हें आप किसी अन्य बैकएंड सर्विस की तरह होस्ट और स्केल कर सकते हैं।

एक पहले के लेख में, मैंने Next.js API बनाने और इसे Sevalla के साथ डिप्लॉय करने के बारे में बताया था। उदाहरण ने डेटा को PostgreSQL डेटाबेस में स्टोर किया और रिक्वेस्ट को सीधे संभाला। यह ठीक काम करता था, लेकिन जैसे-जैसे ट्रैफिक बढ़ता है, APIs जो हर रिक्वेस्ट पर डेटाबेस को हिट करते हैं, धीमे हो सकते हैं।

यहीं कैशिंग काम आती है। Redis को कैश लेयर के रूप में जोड़कर, हम अपने Next.js API को बहुत तेज़ और अधिक कुशल बना सकते हैं। इस लेख में, हम देखेंगे कि अपने API में Redis कैशिंग कैसे जोड़ें, इसे Sevalla के साथ डिप्लॉय करें, और मापने योग्य सुधार दिखाएं।

पिछले लेख में, मैंने API को विस्तार से समझाया था। इसलिए आप इस रिपॉजिटरी का उपयोग इस प्रोजेक्ट के लिए आधार के रूप में कर सकते हैं।

विषय सूची

  • कैशिंग क्यों मायने रखती है

  • Redis क्या है?

  • प्रोजेक्ट सेटअप करना

  • Redis प्रोविजनिंग

  • रीड पर कैश अपडेट करना

  • राइट पर कैश अपडेट करना

  • Sevalla पर डिप्लॉय करना

  • Redis Next.js APIs के साथ अच्छा क्यों काम करता है

  • निष्कर्ष

कैशिंग क्यों मायने रखती है

हर बार जब आपका API डेटाबेस को हिट करता है, तो यह समय और संसाधनों का उपभोग करता है। डेटाबेस संरचित डेटा को स्टोर करने और क्वेरी करने में महान हैं, लेकिन जब आपको प्रति सेकंड हजारों रीड रिक्वेस्ट सर्व करने की आवश्यकता होती है तो वे स्केल पर गति के लिए अनुकूलित नहीं होते।

कैशिंग इसे हल करता है बार-बार एक्सेस किए जाने वाले डेटा को मेमोरी में रखकर। हर बार डेटाबेस से पूछने के बजाय, यदि डेटा उपलब्ध है तो API सीधे कैश से डेटा वापस कर सकता है। Redis इसके लिए एकदम सही है क्योंकि यह प्रदर्शन के लिए डिज़ाइन किया गया एक इन-मेमोरी की-वैल्यू स्टोर है।

उदाहरण के लिए, यदि आप हर रिक्वेस्ट पर डेटाबेस से यूज़र्स की सूची लाते हैं, तो क्वेरी चलाने और परिणाम लौटाने में 200ms लग सकते हैं। Redis कैशिंग के साथ, पहला रिक्वेस्ट परिणाम को मेमोरी में स्टोर करता है, और बाद के रिक्वेस्ट 10ms से कम में वही डेटा वापस कर सकते हैं। यह क्रम-के-परिमाण में सुधार है।

Redis क्या है?

Redis एक इन-मेमोरी डेटा स्टोर है जो सुपर-फास्ट डेटाबेस की तरह काम करता है। डिस्क से लिखने और पढ़ने के बजाय, यह डेटा को मेमोरी में रखता है, जो इसे अविश्वसनीय रूप से तेज़ बनाता है। इसलिए इसे अक्सर कैश के रूप में उपयोग किया जाता है, जहां गति दीर्घकालिक स्टोरेज से अधिक महत्वपूर्ण होती है।

यह बहुत कम लेटेंसी के साथ हाई-थ्रूपुट वर्कलोड को संभालने के लिए डिज़ाइन किया गया है, जिसका अर्थ है कि यह माइक्रोसेकंड में प्रतिक्रिया दे सकता है। यह इसे API प्रतिक्रियाओं को कैश करने, सत्र डेटा स्टोर करने, या चैट सिस्टम और लीडरबोर्ड जैसे रीयल-टाइम एप्लिकेशन को शक्ति देने जैसे उपयोग के मामलों के लिए एक आदर्श फिट बनाता है।

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

Next.js जैसे API के साथ संयुक्त होने पर, Redis मुख्य डेटाबेस पर लोड को कम करने और क्लाइंट को धधकती-तेज़ प्रतिक्रियाएं देने में मदद करता है।

प्रोजेक्ट सेटअप करना

आइए रिपॉजिटरी को क्लोन करें:

git clone git@github.com:manishmshiva/nextjs-api-pgsql.git next-api

अब आइए डायरेक्टरी में जाएं और पैकेज इंस्टॉल करने के लिए npm install करें।

cd next-api
npm i

एक .env फ़ाइल बनाएं और Sevalla से डेटाबेस URL को एक एनवायरनमेंट वेरिएबल में जोड़ें।

cat .env

.env फ़ाइल इस तरह दिखनी चाहिए:

PGSQL_URL=postgres://:-@asia-east1-001.proxy.kinsta.app:30503/

अब आइए सुनिश्चित करें कि एप्लिकेशन अपेक्षित रूप से काम करता है एप्लिकेशन शुरू करके और कुछ API रिक्वेस्ट करके।

ऐप शुरू करना:

npm run dev

आइए सुनिश्चित करें कि डेटाबेस जुड़ा हुआ है। अपने ब्राउज़र पर localhost:3000 पर जाएं। यह निम्न JSON लौटाना चाहिए:

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

आइए एक नया यूज़र बनाएं। Postman का उपयोग करके DB में एक नई एंट्री बनाने के लिए, निम्न JSON के साथ एक POST रिक्वेस्ट भेजें:

{"id":"d9553bb7-2c72-4d92-876b-9c3b40a8c62c","name":"Larry","email":"larry@example.com","age":"25"}

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

ब्राउज़र में localhost:3000/users पर जाकर सुनिश्चित करें कि रिकॉर्ड बनाया गया है।

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

बढ़िया। अब आइए इन APIs को Redis का उपयोग करके कैश करें।

Redis प्रोविजनिंग

आइए Sevalla के डैशबोर्ड पर जाएं और "Databases" पर क्लिक करें। सूची से "Redis" चुनें, और बाकी विकल्पों को डिफ़ॉल्ट छोड़ दें।

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

एक बार डेटाबेस बन जाने के बाद, "external connection" विकल्प को चालू करें और सार्वजनिक रूप से सुलभ URL कॉपी करें।

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

.env फ़ाइल में यह इस तरह दिखना चाहिए:

REDIS_URL=redis://default:@:

अब Node.js के लिए एक Redis क्लाइंट इंस्टॉल करें:

npm install ioredis

हम अब Redis से कनेक्ट कर सकते हैं और इसे अपने यूज़र्स API के लिए कैश लेयर के रूप में उपयोग कर सकते हैं। आइए देखें कि कैशिंग कैसे लागू करें।

रीड पर कैश अपडेट करना

यहां अपडेटेड users/route.ts है जो Redis का उपयोग करता है:

import { NextResponse } from "next/server";
import { Client } from "pg";
import Redis from "ioredis";
const redis = new Redis(process.env.REDIS_URL!);
async function readUsers() {
    const client = new Client({ connectionString: process.env.PGSQL_URL, });
    await client.connect();
    try {
        const result = await client.query("SELECT id, name, email, age FROM users");
        return result.rows;
    } finally {
        await client.end();
    }
}
export async function GET() {
    try {
        // पहले कैश जांचें
        const cached = await redis.get("users");
        if (cached) {
            return NextResponse.json(JSON.parse(cached));
        }
        // कैश में न होने पर डेटाबेस पर फॉलबैक
        const users = await readUsers();
        // परिणाम को 60s TTL के साथ कैश में स्टोर करें
        await redis.set("users", JSON.stringify(users), "EX", 60);
        return NextResponse.json(users);
    } catch (err) {
        return NextResponse.json({ error: "Failed to fetch users" }, { status: 500 });
    }
}

अब, जब आप /users को हिट करते हैं:

  1. API पहले Redis की जांच करता है।

  2. यदि डेटा मौजूद है, तो यह इसे तुरंत लौटाता है।

  3. यदि नहीं, तो यह PostgreSQL को क्वेरी करता है, परिणाम को Redis में सहेजता है, और फिर इसे लौटाता है।

यह दोहराए गए रिक्वेस्ट को अत्यंत तेज़ बनाता है। आप कैश एक्सपायरी (EX 60) को इस आधार पर समायोजित कर सकते हैं कि आपका डेटा कितना ताज़ा होना चाहिए।

Redis कैशिंग के बिना, /users को दस बार लाने का मतलब है दस डेटाबेस क्वेरी। प्रत्येक को डेटाबेस आकार और नेटवर्क लेटेंसी के आधार पर लगभग 150-200ms लग सकते हैं।

Redis के साथ, पहला रिक्वेस्ट अभी भी ~200ms लेता है क्योंकि यह कैश को पॉप्युलेट करता है। लेकिन उसके बाद हर रिक्वेस्ट लगभग तत्काल होता है, अक्सर 10ms से कम। यह 20x सुधार है।

यह स्पीडअप तब मायने रखता है जब आपका API प्रति सेकंड सैकड़ों या हजारों रिक्वेस्ट का सामना करता है। कैशिंग न केवल लेटेंसी को कम करता है बल्कि आपके डेटाबेस पर लोड को भी हल्का करता है।

राइट पर कैश अपडेट करना

अभी, केवल GET रिक्वेस्ट कैश का उपयोग करते हैं। लेकिन क्या होगा अगर हम नए यूज़र जोड़ते हैं? कैश अभी भी पुराना डेटा लौटाएगा।

समाधान यह है कि जब भी राइट होता है तो कैश को अपडेट या क्लियर करें। आइए POST हैंडलर को अपडेट करें:

export async function POST(req: Request) {
    try {
        const body = await req.json();
        const client = new Client({ connectionString: process.env.PGSQL_URL, });
        await client.connect();
        const query = `
            INSERT INTO users (id, name, email, age)
            VALUES ($1, $2, $3, $4)
            RETURNING *;
        `;
        const result = await client.query(query, [
            body.id, body.name, body.email, body.age,
        ]);
        await client.end();
        // कैश को अमान्य करें ताकि अगला GET ताज़ा डेटा लाए
        await redis.del("users");
        return NextResponse.json(result.rows[0]);
    } catch (err) {
        return NextResponse.json({ error: "Failed to add user" }, { status: 500 });
    }
}

अब जब भी एक नया यूज़र बनाया जाता है, users का कैश क्लियर हो जाता है। अगला GET रिक्वेस्ट डेटाबेस से लाएगा, कैश को रीफ्रेश करेगा, और फिर कैश्ड डेटा सर्व करना जारी रखेगा।

Sevalla पर डिप्लॉय करना

अपने कोड को GitHub पर पुश करें या मेरा रिपॉजिटरी फोर्क करें। अब Sevalla पर जाएं और एक नया ऐप बनाएं।

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

ड्रॉपडाउन से अपना रिपॉजिटरी चुनें और "Automatic deployment on commit" चेक करें। यह सुनिश्चित करेगा कि हर बार जब आप कोड पुश करते हैं तो डिप्लॉयमेंट स्वचालित हो। संसाधन अनुभाग के तहत "Hobby" चुनें।

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

"Create" पर क्लिक करें न कि "Create and deploy"। हमने अभी तक अपने PostgreSQL URL और Redis URL को एनवायरनमेंट वेरिएबल के रूप में नहीं जोड़ा है, इसलिए यदि आप इसे डिप्लॉय करने का प्रयास करते हैं तो ऐप क्रैश हो जाएगा।

"Environment variables" सेक्शन पर जाएं और "PGSQL_URL" कुंजी और URL को वैल्यू फ़ील्ड में जोड़ें। "REDIS_URL" कुंजी और Redis URL के लिए भी ऐसा ही करें।

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

अब "Overview" सेक्शन पर वापस जाएं और "Deploy now" पर क्लिक करें।

Sevalla पर Redis कैशिंग के साथ Next.js API प्रदर्शन को बूस्ट करें

एक बार डिप्लॉयमेंट पूरा हो जाने पर, अपने API का लाइव URL प्राप्त करने के लिए "Visit app" पर क्लिक करें। आप Postman में localhost:3000 को नए URL से बदल सकते हैं और अपने API का परीक्षण कर सकते हैं।

Redis Next.js APIs के साथ अच्छा क्यों काम करता है

Redis हल्का, धधकता हुआ तेज़ है, और API प्रतिक्रियाओं को कैश करने के लिए एकदम सही है। Next.js के संदर्भ में, यह स्वाभाविक रूप से फिट बैठता है क्योंकि:

  • API रूट सर्वर-साइड चलते हैं जहां Redis को सीधे क्वेरी किया जा सकता है।

  • डेटाबेस कॉल के चारों ओर कैशिंग लॉजिक जोड़ना सरल है।

  • Redis का उपयोग कैशिंग से अधिक के लिए किया जा सकता है - रेट लिमिटिंग, सत्र स्टोरेज, और पब/सब भी सामान्य पैटर्न हैं।

Next.js, PostgreSQL, और Redis को Sevalla पर संयोजित करके, आपको एक स्टैक मिलता है जो तेज़, स्केलेबल, और डिप्लॉय करने में आसान है।

निष्कर्ष

कैशिंग केवल एक अनुकूलन नहीं है - यह वास्तविक दुनिया के APIs के लिए एक आवश्यकता है। Next.js आपको मजबूत बैकएंड APIs बनाने में मदद करता है जिन्हें आसानी से डिप्लॉय किया जा सकता है। Redis को मिश्रण में जोड़कर, वे APIs पसीना बहाए बिना स्केल को संभाल सकते हैं।

Sevalla मैनेज्ड PostgreSQL, Redis, और ऐप होस्टिंग को एक ही स्थान पर प्रदान करके यह सब एक साथ बांधता है। कुछ एनवायरनमेंट वेरिएबल और एक GitHub रिपॉजिटरी के साथ, आप स्थानीय डेव से प्रोडक्शन-रेडी, कैश्ड API तक मिनटों में जा सकते हैं।

उम्मीद है आपको यह लेख पसंद आया। मेरे मुफ़्त AI न्यूज़लेटर के लिए साइन अप करें TuringTalks.ai AI पर अधिक हैंड्स-ऑन ट्यूटोरियल के लिए। आप मुझे LinkedIn पर भी ढूंढ सकते हैं।

  1. JavaScript में स्क्रॉल डाउन लूप को रोकना JavaScript में स्क्रॉल डाउन लूप को रोकना

    लूप को रोकने के लिए, JavaScript में clearInterval() का उपयोग करें।उदाहरणकोड निम्न है:<!DOCTYPE html> <html lang=en> <head>    <meta charset=UTF-8>    <meta name=viewport content=width=device-width, initial-scale=1.0>    <title>Documen

  1. HTML canvas shadowOffsetY प्रॉपर्टी HTML canvas shadowOffsetY प्रॉपर्टी

    HTML canvas की shadowOffsetY प्रॉपर्टी आकृति से छाया की ऊर्ध्वाधर दूरी सेट करने के लिए उपयोग की जाती है। <canvas> एलिमेंट आपको JavaScript का उपयोग करके वेब पेज पर ग्राफिक्स बनाने की अनुमति देता है। हर canvas में दो एलिमेंट्स होते हैं जो canvas की ऊंचाई और चौड़ाई का वर्णन करते हैं यानी क्रमशः h

  1. GTD के साथ उत्पादकता में महारत हासिल करें: काम पूरा करने की सिद्ध मार्गदर्शिका GTD के साथ उत्पादकता में महारत हासिल करें: काम पूरा करने की सिद्ध मार्गदर्शिका

    क्या आपको उन चीजों को करने के लिए अधिक समय की आवश्यकता है जिनका आप आनंद लेते हैं? बेशक, आप करते हैं। गीक्स के लिए बहुत सारी तकनीकी परियोजनाएं हैं जिनसे छेड़छाड़ की जा सकती है, लेकिन हमारे पास पर्याप्त समय नहीं है। वर्षों से, मैंने कुछ समय प्रबंधन और उत्पादकता प्रणालियों की कोशिश की है। जबकि उन सभी न