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

Node.js और Redis वितरित कैशिंग के साथ एक उच्च-प्रदर्शन URL शॉर्टनर बनाएं

Node.js और Redis वितरित कैशिंग के साथ एक उच्च-प्रदर्शन URL शॉर्टनर बनाएं <पी> इस ट्यूटोरियल में, हम Node.js और Redis का उपयोग करके एक स्केलेबल URL शॉर्टिंग सेवा बनाएंगे। यह सेवा उच्च ट्रैफ़िक को कुशलतापूर्वक संभालने, विलंबता को कम करने और निर्बाध रूप से स्केल करने के लिए वितरित कैशिंग का लाभ उठाएगी। यह सुनिश्चित करने के लिए कि सिस्टम तेज़ और विश्वसनीय बना रहे, हम लगातार हैशिंग, कैश अमान्यकरण रणनीतियों और शार्डिंग जैसी प्रमुख अवधारणाओं का पता लगाएंगे।

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

आप क्या सीखेंगे

  • <पी> Node.js का उपयोग करके URL शॉर्टनर सेवा कैसे बनाएं और रेडिस .

  • <पी> वितरित कैशिंग कैसे कार्यान्वित करें प्रदर्शन को अनुकूलित करने के लिए।

  • <पी> लगातार हैशिंग को समझना और कैश अमान्यकरण रणनीतियाँ .

  • <पी> डॉकर का उपयोग करना शार्डिंग और स्केलिंग के लिए कई रेडिस उदाहरणों का अनुकरण करना।

आवश्यकताएँ

<पी> शुरू करने से पहले, सुनिश्चित करें कि आपने निम्नलिखित इंस्टॉल कर लिया है:

  • <पी> Node.js (v14 या उच्चतर)

  • <पी> रेडिस

  • <पी> डॉकर

  • <पी> JavaScript, Node.js और Redis का बुनियादी ज्ञान।

सामग्री तालिका

  • <पी> परियोजना अवलोकन

  • <पी> चरण 1:प्रोजेक्ट स्थापित करना

  • <पी> चरण 2:रेडिस इंस्टेंस सेट करना

  • <पी> चरण 3:यूआरएल शॉर्टनर सेवा को लागू करना
  • <पी> चरण 4:कैश अमान्यकरण लागू करना

  • <पी> चरण 5:कैश मेट्रिक्स की निगरानी

  • <पी> चरण 6:एप्लिकेशन का परीक्षण

  • <पी> निष्कर्ष:आपने क्या सीखा

प्रोजेक्ट अवलोकन

<पी> हम एक यूआरएल शॉर्टनर सेवा बनाएंगे जहां:

  1. <पी> उपयोगकर्ता लंबे URL को छोटा कर सकते हैं और मूल URL पुनः प्राप्त कर सकते हैं।

  2. <पी> सेवा रेडिस कैशिंग का उपयोग करती है संक्षिप्त URL और मूल URL के बीच मैपिंग संग्रहीत करने के लिए।

  3. <पी> उच्च ट्रैफ़िक को संभालने के लिए कैश को कई रेडिस इंस्टेंसेस में वितरित किया जाता है।

  4. <पी> सिस्टम कैश हिट प्रदर्शित करेगा औरचूकता है वास्तविक समय में।

सिस्टम आर्किटेक्चर

<पी> स्केलेबिलिटी और प्रदर्शन सुनिश्चित करने के लिए, हम अपनी सेवा को निम्नलिखित घटकों में विभाजित करेंगे:

  1. <पी> एपीआई सर्वर :यूआरएल को छोटा करने और पुनः प्राप्त करने के अनुरोधों को संभालता है।

  2. <पी> रेडिस कैशिंग परत :वितरित कैशिंग के लिए एकाधिक रेडिस इंस्टेंस का उपयोग करता है।

  3. <पी> डॉकर :एकाधिक रेडिस कंटेनरों के साथ एक वितरित वातावरण का अनुकरण करता है।

चरण 1:परियोजना की स्थापना

<पी> आइए एक Node.js एप्लिकेशन प्रारंभ करके अपना प्रोजेक्ट सेट करें:

mkdir scalable-url-shortener
cd scalable-url-shortener
npm init -y
<पी> अब, आवश्यक निर्भरताएँ स्थापित करें:

npm install express redis shortid dotenv
  • <पी> express :एक हल्का वेब सर्वर ढांचा।

  • <पी> redis :कैशिंग को संभालने के लिए.

  • <पी> shortid :लघु, अद्वितीय आईडी बनाने के लिए।

  • <पी> dotenv :पर्यावरण चर के प्रबंधन के लिए।

<पी> एक .env बनाएं अपने प्रोजेक्ट के मूल में फ़ाइल करें:

PORT=3000
REDIS_HOST_1=localhost
REDIS_PORT_1=6379
REDIS_HOST_2=localhost
REDIS_PORT_2=6380
REDIS_HOST_3=localhost
REDIS_PORT_3=6381
<पी> ये वेरिएबल हमारे द्वारा उपयोग किए जाने वाले रेडिस होस्ट और पोर्ट को परिभाषित करते हैं।

चरण 2:रेडिस इंस्टेंस सेट करना

<पी> हम कई Redis उदाहरणों के साथ वितरित वातावरण का अनुकरण करने के लिए डॉकर का उपयोग करेंगे।

<पी> तीन रेडिस कंटेनर शुरू करने के लिए निम्नलिखित कमांड चलाएँ:

docker run -p 6379:6379 --name redis1 -d redis
docker run -p 6380:6379 --name redis2 -d redis
docker run -p 6381:6379 --name redis3 -d redis
<पी> यह विभिन्न पोर्ट पर चलने वाले तीन रेडिस इंस्टेंस स्थापित करेगा। हम इन उदाहरणों का उपयोग संगत हैशिंग लागू करने के लिए करेंगे और साझा करना।

चरण 3:यूआरएल शॉर्टनर सेवा लागू करना

<पी> आइए अपनी मुख्य एप्लिकेशन फ़ाइल, index.js बनाएं :

require('dotenv').config();
const express = require('express');
const redis = require('redis');
const shortid = require('shortid');
const app = express();
app.use(express.json());
const redisClients = [
 redis.createClient({ host: process.env.REDIS_HOST_1, port: process.env.REDIS_PORT_1 }),
 redis.createClient({ host: process.env.REDIS_HOST_2, port: process.env.REDIS_PORT_2 }),
 redis.createClient({ host: process.env.REDIS_HOST_3, port: process.env.REDIS_PORT_3 })
];
// Hash function to distribute keys among Redis clients
function getRedisClient(key) {
 const hash = key.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);
 return redisClients[hash % redisClients.length];
}
// Endpoint to shorten a URL
app.post('/shorten', async (req, res) => {
 const { url } = req.body;
 if (!url) return res.status(400).send('URL is required');
 const shortId = shortid.generate();
 const redisClient = getRedisClient(shortId);
 await redisClient.set(shortId, url);
 res.json({ shortUrl: `http://localhost:${process.env.PORT}/${shortId}` });
});
// Endpoint to retrieve the original URL
app.get('/:shortId', async (req, res) => {
 const { shortId } = req.params;
 const redisClient = getRedisClient(shortId);
 redisClient.get(shortId, (err, url) => {
 if (err || !url) {
 return res.status(404).send('URL not found');
 }
 res.redirect(url);
 });
});
app.listen(process.env.PORT, () => {
 console.log(`Server running on port ${process.env.PORT}`);
});
<पी> जैसा कि आप इस कोड में देख सकते हैं, हमारे पास:

है
  1. <पी> लगातार हैशिंग :

    • <पी> हम एक साधारण हैश फ़ंक्शन का उपयोग करके कई Redis क्लाइंट में कुंजियाँ (छोटा URL) वितरित करते हैं।

    • <पी> हैश फ़ंक्शन यह सुनिश्चित करता है कि यूआरएल रेडिस इंस्टेंसेस में समान रूप से वितरित किए गए हैं।

  2. <पी> यूआरएल छोटा करना :

    • <पी> द/छोटाकरें एंडपॉइंट एक लंबे URL को स्वीकार करता है और shortid का उपयोग करके एक छोटी आईडी उत्पन्न करता है पुस्तकालय.

    • <पी> छोटा किया गया यूआरएल हमारे हैश फ़ंक्शन का उपयोग करके रेडिस इंस्टेंस में से एक में संग्रहीत किया जाता है।

  3. <पी> यूआरएल पुनर्निर्देशन :

    • <पी> /:shortId एंडपॉइंट कैश से मूल URL पुनर्प्राप्त करता है और उपयोगकर्ता को रीडायरेक्ट करता है।

    • <पी> यदि URL कैश में नहीं मिलता है, तो 404 प्रतिक्रिया लौटा दी गई है.

चरण 4:कैश अमान्यकरण लागू करना

<पी> वास्तविक दुनिया के एप्लिकेशन में, URL समय के साथ समाप्त हो सकते हैं या बदल सकते हैं। इसे संभालने के लिए, हमें कैश अमान्यकरण लागू करने की आवश्यकता है .

कैश्ड यूआरएल में एक्सपायरी जोड़ना

<पी> आइए हमारे index.js को संशोधित करें प्रत्येक कैश्ड प्रविष्टि के लिए समाप्ति समय निर्धारित करने के लिए फ़ाइल:

// Endpoint to shorten a URL with expiration
app.post('/shorten', async (req, res) => {
 const { url, ttl } = req.body; // ttl (time-to-live) is optional
 if (!url) return res.status(400).send('URL is required');
 const shortId = shortid.generate();
 const redisClient = getRedisClient(shortId);
 await redisClient.set(shortId, url, 'EX', ttl || 3600); // Default TTL of 1 hour
 res.json({ shortUrl: `http://localhost:${process.env.PORT}/${shortId}` });
});
  • <पी> टीटीएल (टाइम-टू-लिव) :हमने डिफ़ॉल्ट समाप्ति समय 1 घंटा निर्धारित किया है प्रत्येक संक्षिप्त URL के लिए. यदि आवश्यक हो तो आप प्रत्येक यूआरएल के लिए टीटीएल को कस्टमाइज़ कर सकते हैं।

  • <पी> कैश अमान्य :जब टीटीएल समाप्त हो जाता है, तो प्रविष्टि स्वचालित रूप से कैश से हटा दी जाती है।

चरण 5:कैश मेट्रिक्स की निगरानी

<पी> कैश हिट्स की निगरानी करने के लिए औरचूकता है , हम index.js में अपने एंडपॉइंट पर कुछ लॉगिंग जोड़ेंगे :

app.get('/:shortId', async (req, res) => {
 const { shortId } = req.params;
 const redisClient = getRedisClient(shortId);
 redisClient.get(shortId, (err, url) => {
 if (err || !url) {
 console.log(`Cache miss for key: ${shortId}`);
 return res.status(404).send('URL not found');
 }
 console.log(`Cache hit for key: ${shortId}`);
 res.redirect(url);
 });
});
<पी> इस कोड में क्या चल रहा है:

  • <पी> कैश हिट :यदि कोई URL कैश में पाया जाता है, तो यह कैश हिट है।

  • <पी> कैश छूट गया :यदि कोई URL नहीं मिलता है, तो यह कैश मिस है।

  • <पी> यह लॉगिंग आपको अपने वितरित कैश के प्रदर्शन की निगरानी करने में मदद करेगी।

चरण 6:एप्लिकेशन का परीक्षण

  1. अपना रेडिस इंस्टेंस प्रारंभ करें :
docker start redis1 redis2 redis3
  1. Node.js सर्वर चलाएँ :
node index.js
  1. <पी> अंतिम बिंदुओं का परीक्षण करें curl का उपयोग करके या डाकिया:

    • <पी> URL छोटा करें:

       POST http://localhost:3000/shorten
       Body: { "url": "https://example.com" }
      
    • <पी> संक्षिप्त URL तक पहुंचें:

       GET http://localhost:3000/{shortId}
      

निष्कर्ष:आपने क्या सीखा

<पी> बधाई हो! आपने सफलतापूर्वक एक स्केलेबल यूआरएल शॉर्टनर सेवा बना ली है वितरित कैशिंग के साथ Node.js और Redis का उपयोग करना। इस पूरे ट्यूटोरियल में, आपने सीखा कि कैसे:

  1. <पी> लगातार हैशिंग लागू करें एकाधिक Redis उदाहरणों में कैश प्रविष्टियाँ वितरित करने के लिए।

  2. <पी> कैश अमान्यकरण रणनीतियों के साथ अपने एप्लिकेशन को अनुकूलित करें डेटा को अद्यतन रखने के लिए।

  3. <पी> डॉकर का उपयोग करें एकाधिक रेडिस नोड्स के साथ एक वितरित वातावरण का अनुकरण करने के लिए।

  4. <पी> कैश हिट और मिस की निगरानी करें प्रदर्शन को अनुकूलित करने के लिए।

अगले चरण:

  • <पी> डेटाबेस जोड़ें :कैश से परे निरंतरता के लिए डेटाबेस में URL संग्रहीत करें।

  • <पी> एनालिटिक्स लागू करें :छोटे यूआरएल के लिए क्लिक की संख्या और विश्लेषण को ट्रैक करें।

  • <पी> बादल पर तैनाती :ऑटो-स्केलिंग और लचीलेपन के लिए कुबेरनेट्स का उपयोग करके अपने एप्लिकेशन को तैनात करें।

<पी> हैप्पी कोडिंग!

<पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें


  1. जावास्क्रिप्ट में ईवेंट ऑब्जेक्ट्स को एक फ़ंक्शन से दूसरे फ़ंक्शन में कैसे पास करें? जावास्क्रिप्ट में ईवेंट ऑब्जेक्ट्स को एक फ़ंक्शन से दूसरे फ़ंक्शन में कैसे पास करें?

    जावास्क्रिप्ट में ईवेंट ऑब्जेक्ट को एक फ़ंक्शन से दूसरे फ़ंक्शन में पास करने के लिए कोड निम्नलिखित है - उदाहरण <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-sca

  1. Oracle ग्रिड को 12c से 19c . में अपग्रेड करें Oracle ग्रिड को 12c से 19c . में अपग्रेड करें

    इस पोस्ट में दो-नोड Oracle® ग्रिड रीयलएप्लिकेशन क्लस्टर (RAC) को संस्करण 12C (12.1.0.2) से 19C (19.7.0) तक अपग्रेड करने के लिए चरण-दर-चरण दृष्टिकोण शामिल है जो aLinux® ऑपरेटिंग सिस्टम (OS) पर चलता है। परिचय Oracle Grid RAC के लिए नवीनतम उपलब्ध संस्करण 19c है। Oracle बेहतर स्थिरता और सुरक्षा के लिए

  1. पायथन में वृत्ताकार (ध्रुवीय) हिस्टोग्राम पायथन में वृत्ताकार (ध्रुवीय) हिस्टोग्राम

    पायथन में सर्कुलर (ध्रुवीय) हिस्टोग्राम प्लॉट करने के लिए, हम निम्नलिखित कदम उठा सकते हैं- थीटा . के लिए डेटा बिंदु बनाएं , त्रिज्या और चौड़ाई numpy का उपयोग करना। वर्तमान आंकड़े में एक सबप्लॉट जोड़ें, जहां प्रक्षेपण=ध्रुवीय और nrows=1, ncols=1 andindex=1. . bar() . का उपयोग करके बार प्लॉट बनाएं व