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

रेडिस के साथ अपने वेब एपीआई को बढ़ावा दें:एक सिद्ध प्रदर्शन अनुकूलन गाइड

रेडिस के साथ अपने वेब एपीआई को बढ़ावा दें:एक सिद्ध प्रदर्शन अनुकूलन गाइड <पी> तारिक़ इजाज़

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

<पी> रेडिस के साथ अपने वेब एपीआई को बढ़ावा दें:एक सिद्ध प्रदर्शन अनुकूलन गाइड "आने वाले 100 से 200 वर्षों में कैशिंग स्पष्ट रूप से अभी भी अत्यंत महत्वपूर्ण भूमिका निभाएगी।"

रेडिस:एक आम आदमी का अवलोकन

<पी> आधिकारिक दस्तावेज के अनुसार, रेडिस को इन-मेमोरी डेटा स्ट्रक्चर स्टोर के रूप में परिभाषित किया गया है जिसका उपयोग डेटाबेस, संदेश ब्रोकर या कैश स्टोरेज के रूप में किया जाता है। यह स्ट्रिंग्स, हैश, सूचियां, सेट, रेंज क्वेरी के साथ सॉर्ट किए गए सेट, बिटमैप्स, हाइपरलॉगलॉग, रेडियस क्वेरी और स्ट्रीम के साथ भू-स्थानिक इंडेक्स जैसे डेटा संरचनाओं का समर्थन करता है। <पी> ठीक है, वहाँ बहुत सारी डेटा संरचनाएँ हैं। इसे सरल बनाने के लिए, समर्थित लगभग सभी डेटा संरचनाओं को स्ट्रिंग के एक या दूसरे रूप में संघनित किया जा सकता है। जैसे-जैसे हम कार्यान्वयन के माध्यम से आगे बढ़ेंगे आपको अधिक स्पष्टता मिलेगी।

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

चलो कोड पर बात करें

<पी> इससे पहले कि हम शुरू करें, आपको अपने स्थानीय सिस्टम में रेडिस सेटअप प्राप्त करना होगा। रेडिस को चालू करने और चलाने के लिए आप इस त्वरित सेटअप प्रक्रिया का पालन कर सकते हैं। <पी> हो गया? ठंडा। चलो शुरू करो। हमारे पास एक्सप्रेस में बनाया गया एक सरल एप्लिकेशन है जो डेटा को पढ़ने और लिखने के लिए MongoDB एटलस में एक उदाहरण का उपयोग करता है। <पी> हमारे पास /blogs में दो प्रमुख API बनाए गए हैं रूट फ़ाइल.

...
// GET - Fetches all blog posts for required user
blogsRouter.route('/:user')
 .get(async (req, res, next) => {
 const blogs = await Blog.find({ user: req.params.user });
 res.status(200).json({
 blogs,
 });
 });
// POST - Creates a new blog post
blogsRouter.route('/')
 .post(async (req, res, next) => {
 const existingBlog = await Blog.findOne({ title: req.body.title });
 if (!existingBlog) {
 let newBlog = new Blog(req.body);
 const result = await newBlog.save();
 return res.status(200).json({
 message: `Blog ${result.id} is successfully created`,
 result,
 });
 }
 res.status(200).json({
 message: 'Blog with same title exists',
 });
 });
...

कुछ रेडिस अच्छाई छिड़कना

<पी> हम एनपीएम पैकेज redis डाउनलोड करके शुरुआत करते हैं स्थानीय रेडिस सर्वर से कनेक्ट करने के लिए।
const mongoose = require('mongoose');
const redis = require('redis');
const util = require('util');
const redisUrl = 'redis://127.0.0.1:6379';
const client = redis.createClient(redisUrl);
client.hget = util.promisify(client.hget);
...
<पी> हम utils.promisify का उपयोग करते हैं client.hget को रूपांतरित करने का कार्य कॉलबैक के बजाय वादा वापस करने का कार्य। आप promisification के बारे में अधिक पढ़ सकते हैं यहाँ.

<पी> रेडिस कनेक्शन स्थापित है. इससे पहले कि हम कोई और कैशिंग कोड लिखना शुरू करें, आइए एक कदम पीछे हटें और यह समझने की कोशिश करें कि हमें किन आवश्यकताओं को पूरा करने की आवश्यकता है और हमें किन संभावित चुनौतियों का सामना करना पड़ सकता है। <पी> हमारी कैशिंग रणनीति निम्नलिखित बिंदुओं को संबोधित करने में सक्षम होनी चाहिए।

  • किसी विशेष उपयोगकर्ता के लिए सभी ब्लॉग पोस्ट के अनुरोध को कैश करें
  • <पी> हर बार कोई नया ब्लॉग पोस्ट बनाए जाने पर कैशे साफ़ करें

    <पी> अपनी रणनीति बनाते समय हमें संभावित चुनौतियों से सावधान रहना चाहिए:

  • <पी> कैश डेटा संग्रहीत करने के लिए कुंजी निर्माण को संभालने का सही तरीका

  • कैश समाप्ति तर्क और कैश ताजगी बनाए रखने के लिए जबरन समाप्ति
  • कैशिंग लॉजिक का पुन:प्रयोज्य कार्यान्वयन
<पी> ठीक है. हमने अपने अंक लिख लिए हैं और पुनः जुड़े हुए हैं। अगले चरण पर.

डिफ़ॉल्ट Mongoose Exec फ़ंक्शन को ओवरराइड करना

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

...
const exec = mongoose.Query.prototype.exec;
...
mongoose.Query.prototype.exec = async function() {
 ...
 const result = await exec.apply(this, arguments);
 console.log('Data Source: Database');
 return result;
}
...
<पी> हम क्वेरी में पहले निष्पादन के रूप में अपने कैशिंग लॉजिक कोड को जोड़ने के लिए नेवले के प्रोटोटाइप ऑब्जेक्ट का उपयोग करते हैं।

कैश को क्वेरी के रूप में जोड़ना

<पी> यह बताने के लिए कि कैशिंग के लिए कौन सी क्वेरीज़ होनी चाहिए, हम एक नेवला क्वेरी बनाते हैं। हम user पास करने की क्षमता प्रदान करते हैं options के माध्यम से हैश-कुंजी के रूप में उपयोग किया जाना है वस्तु. <पी> ध्यान दें: हैशकी एक हैश डेटा संरचना के लिए एक पहचानकर्ता के रूप में कार्य करता है, जिसे आम शब्दों में, कुंजी-मूल्य जोड़े के सेट के लिए मूल कुंजी के रूप में कहा जा सकता है। जिससे, बड़ी संख्या में क्वेरी-वैल्यू सेट की कैशिंग सक्षम हो सके। आप यहां रेडिस में हैश के बारे में अधिक पढ़ सकते हैं।

...
mongoose.Query.prototype.cache = function(options = {}) {
 this.enableCache = true;
 this.hashKey = JSON.stringify(options.key || 'default');
 return this;
};
...
<पी> ऐसा करने पर, हम आसानी से cache(<options argument>) का उपयोग कर सकते हैं क्वेरी के साथ-साथ क्वेरी को हम निम्नलिखित तरीके से कैश करना चाहते हैं।

...
const blogs = await Blog
 .find({ user: req.params.user })
 .cache({ key: req.params.user });
...

कैश लॉजिक तैयार करना

<पी> हमने यह दर्शाने के लिए एक सामान्य पुन:प्रयोज्य क्वेरी स्थापित की है कि किन प्रश्नों को कैश्ड करने की आवश्यकता है। आइए आगे बढ़ें और केंद्रीय कैशिंग तर्क लिखें।

...
mongoose.Query.prototype.exec = async function() {
 if (!this.enableCache) {
 console.log('Data Source: Database');
 return exec.apply(this, arguments);
 }
 const key = JSON.stringify(Object.assign({}, this.getQuery(), {
 collection: this.mongooseCollection.name,
 }));
 const cachedValue = await client.hget(this.hashKey, key);
 if (cachedValue) {
 const parsedCache = JSON.parse(cachedValue);
 console.log('Data Source: Cache');
 return Array.isArray(parsedCache) 
 ? parsedCache.map(doc => new this.model(doc)) 
 : new this.model(parsedCache);
 }
 const result = await exec.apply(this, arguments);
 client.hmset(this.hashKey, key, JSON.stringify(result), 'EX', 300);
 console.log('Data Source: Database');
 return result;
};
...
<पी> जब भी हम cache() का उपयोग करते हैं अपनी मुख्य क्वेरी के साथ, हम enableCache सेट करते हैं सच होने की कुंजी. <पी> यदि कुंजी गलत है, तो हम मुख्य exec लौटाते हैं डिफ़ॉल्ट के रूप में क्वेरी करें. यदि नहीं, तो हम पहले कैश डेटा को लाने और संग्रहीत/रीफ्रेश करने के लिए कुंजी बनाते हैं। <पी> हम collection का उपयोग करते हैं विशिष्टता के लिए मुख्य नाम के रूप में डिफ़ॉल्ट क्वेरी के साथ नाम जोड़ें। प्रयुक्त हैश-कुंजी user का नाम है जिसे हम पहले ही cache() में सेट कर चुके हैं फ़ंक्शन परिभाषा. <पी> कैश्ड डेटा client.hget() का उपयोग करके प्राप्त किया जाता है फ़ंक्शन जिसके लिए पैरामीटर के रूप में हैश-कुंजी और परिणामी कुंजी की आवश्यकता होती है। <पी> ध्यान दें: हम हमेशा JSON.parse() का उपयोग करते हैं रेडिस से कोई भी डेटा लाते समय। और इसी तरह, हम JSON.stringify() का उपयोग करते हैं रेडिस में कुछ भी संग्रहीत करने से पहले कुंजी और डेटा पर। ऐसा इसलिए किया जाता है क्योंकि redis JSON डेटा संरचनाओं का समर्थन नहीं करता है।

<पी> एक बार जब हम कैश्ड डेटा प्राप्त कर लेते हैं, तो हमें प्रत्येक कैश्ड ऑब्जेक्ट को एक नेवला मॉडल में बदलना होगा। यह केवल new this.model(<object>) का उपयोग करके किया जा सकता है . <पी> यदि कैश में आवश्यक डेटा नहीं है, तो हम डेटाबेस से एक क्वेरी बनाते हैं। फिर, एपीआई में डेटा लौटाने के बाद, हम client.hmset() का उपयोग करके कैश को रीफ्रेश करते हैं . हमने 300 सेकंड का डिफ़ॉल्ट कैश समाप्ति समय भी निर्धारित किया है। यह आपकी कैशिंग रणनीति के आधार पर अनुकूलन योग्य है।

<पी> कैशिंग तर्क यथास्थान है. हमने एक डिफ़ॉल्ट समाप्ति समय भी निर्धारित किया है। आगे, जब भी कोई नया ब्लॉग पोस्ट बनाया जाता है तो हम ज़बरदस्ती कैश समाप्ति पर विचार करते हैं।

जबरन कैश समाप्ति

<पी> कुछ मामलों में, जैसे कि जब कोई उपयोगकर्ता एक नया ब्लॉग पोस्ट बनाता है, तो उपयोगकर्ता उम्मीद करता है कि जब वे सभी पोस्ट लाएंगे तो नई पोस्ट उपलब्ध होनी चाहिए। <पी> ऐसा करने के लिए, हमें उस उपयोगकर्ता से संबंधित कैश को साफ़ करना होगा और उसे नए डेटा के साथ अपडेट करना होगा। इसलिए हमें समाप्ति को बाध्य करना होगा। हम del() को लागू करके ऐसा कर सकते हैं रेडिस द्वारा प्रदान किया गया फ़ंक्शन।
...
module.exports = {
 clearCache(hashKey) {
 console.log('Cache cleaned');
 client.del(JSON.stringify(hashKey));
 }
}
...
<पी> हमें यह भी ध्यान रखना होगा कि हम कई मार्गों पर समाप्ति को बाध्य करेंगे। एक विस्तार योग्य तरीका इस clearCache() का उपयोग करना है एक मिडलवेयर के रूप में और रूट से संबंधित किसी भी क्वेरी का निष्पादन समाप्त होने के बाद इसे कॉल करें।
const { clearCache } = require('../services/cache');
module.exports = async (req, res, next) => {
 // wait for route handler to finish running
 await next(); 
 clearCache(req.body.user);
}
<पी> इस मिडलवेयर को निम्नलिखित तरीके से किसी विशेष रूट पर आसानी से कॉल किया जा सकता है।

...
blogsRouter.route('/')
 .post(cleanCache, async (req, res, next) => {
 ...
 }
...
<पी> और हमारा काम हो गया. मैं सहमत हूं कि यह बहुत सारा कोड था। लेकिन उस अंतिम भाग के साथ, हमने अपने एप्लिकेशन के साथ रेडिस स्थापित किया है और लगभग सभी संभावित चुनौतियों का ध्यान रखा है। अब हमारी कैशिंग रणनीति को क्रियान्वित होते देखने का समय आ गया है।

रेडिस इन एक्शन

<पी> हम अपनी कैशिंग रणनीति को क्रियान्वित करने के लिए एपीआई क्लाइंट के रूप में पोस्टमैन का उपयोग करते हैं। ये रहा। आइए एक-एक करके एपीआई ऑपरेशंस को देखें।

  1. हम /blogs का उपयोग करके एक नया ब्लॉग पोस्ट बनाते हैं मार्ग
<पी> रेडिस के साथ अपने वेब एपीआई को बढ़ावा दें:एक सिद्ध प्रदर्शन अनुकूलन गाइड नया ब्लॉग पोस्ट निर्माण
  1. फिर हम उपयोगकर्ता tejaz से संबंधित सभी ब्लॉग पोस्ट लाते हैं
<पी> रेडिस के साथ अपने वेब एपीआई को बढ़ावा दें:एक सिद्ध प्रदर्शन अनुकूलन गाइड तेजाज़ उपयोगकर्ता के लिए सभी ब्लॉग पोस्ट लाए जा रहे हैं
  1. हम उपयोगकर्ता tejaz के लिए सभी ब्लॉग पोस्ट लाते हैं एक बार फिर.
<पी> रेडिस के साथ अपने वेब एपीआई को बढ़ावा दें:एक सिद्ध प्रदर्शन अनुकूलन गाइड एक बार फिर तेजाज उपयोगकर्ता के लिए सभी ब्लॉग पोस्ट प्राप्त करें <पी> आप स्पष्ट रूप से देख सकते हैं कि जब हम कैश से लाते हैं, तो लगने वाला समय 409ms से कम हो गया है। 24ms तक . यह लगने वाले समय को लगभग 95% कम करके आपके एपीआई को सुपरचार्ज कर देता है <पी> साथ ही, हम स्पष्ट रूप से देख सकते हैं कि कैश समाप्ति और अद्यतन संचालन अपेक्षा के अनुरूप काम करते हैं।

<पी> आप संपूर्ण स्रोत कोड redis-express में पा सकते हैं फ़ोल्डर यहाँ.

निष्कर्ष

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

<पी> आप रेडिस कमांड का पूरा सेट यहां पा सकते हैं। आप इसे redis-cli के साथ उपयोग कर सकते हैं आपके कैश डेटा और एप्लिकेशन प्रक्रियाओं की निगरानी करने के लिए। <पी> किसी विशेष प्रौद्योगिकी द्वारा प्रदान की जाने वाली संभावनाएँ वास्तव में अनंत हैं। यदि आपके कोई प्रश्न हैं, तो आप [LinkedIn](https://www.linkedin.com/in/tarique-ejaz/) पर मुझसे संपर्क कर सकते हैं . <पी> इस बीच, कोडिंग करते रहें।

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


  1. सीएसएस के साथ एक निश्चित साइड नेविगेशन मेनू कैसे बनाएं? सीएसएस के साथ एक निश्चित साइड नेविगेशन मेनू कैसे बनाएं?

    CSS का उपयोग करके एक निश्चित साइड नेविगेशन मेनू बनाने के लिए निम्नलिखित कोड है - उदाहरण <!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <

  1. जांचें कि इनपुट जावास्क्रिप्ट में एक संख्या या अक्षर है या नहीं? जांचें कि इनपुट जावास्क्रिप्ट में एक संख्या या अक्षर है या नहीं?

    यह जांचने के लिए कि इनपुट एक संख्या या अक्षर है, जावास्क्रिप्ट से isNaN () फ़ंक्शन का उपयोग करें। यदि मान NaN है यानी संख्या नहीं है तो यह सही है। निम्नलिखित कोड है - उदाहरण <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name=&qu

  1. मैं टिंकर में फ्रेम की पृष्ठभूमि कैसे बदलूं? मैं टिंकर में फ्रेम की पृष्ठभूमि कैसे बदलूं?

    टिंकर फ्रेम की पृष्ठभूमि का रंग और अग्रभूमि का रंग बदलने के लिए, हम bg को अलग-अलग मान निर्दिष्ट कर सकते हैं और fg फ़्रेम . में पैरामीटर समारोह। उदाहरण इस उदाहरण में, हमने अलग-अलग पृष्ठभूमि रंगों के साथ दो फ़्रेम बनाए हैं। #टिंकर आयात से आवश्यक पुस्तकालयों को आयात करें *#टिंकर फ्रेमविन का एक उदाहरण