द्वारा मेहुल मोहन
Redis विभिन्न प्रोजेक्ट्स के लिए उपयोग किया जाने वाला एक लोकप्रिय इन-मेमोरी डेटाबेस है, जैसे कैशिंग और रेट लिमिटिंग।
इस ब्लॉग पोस्ट में, हम देखेंगे कि आप Redis को इन-मेमोरी डेटाबेस के रूप में कैसे उपयोग कर सकते हैं, आप Redis का उपयोग क्यों करना चाहेंगे, और अंत में हम डेटाबेस की कुछ महत्वपूर्ण विशेषताओं पर चर्चा करेंगे। आइए शुरू करें।
इन-मेमोरी डेटाबेस क्या है?
पारंपरिक डेटाबेस डेटाबेस के एक हिस्से (आमतौर पर "हॉट" या अक्सर एक्सेस किए जाने वाले इंडेक्स) को तेज़ एक्सेस के लिए मेमोरी में रखते हैं, और बाकी डेटाबेस को डिस्क पर।
दूसरी ओर, Redis लेटेंसी और डेटा की तेज़ पुनर्प्राप्ति और स्टोरेज पर बहुत ध्यान केंद्रित करता है। इसलिए यह स्टोरेज डिवाइस (SSD/HDD) के बजाय पूरी तरह से मेमोरी (RAM) पर काम करता है। गति महत्वपूर्ण है!
Redis एक की-वैल्यू डेटाबेस है। लेकिन यह आपको यह सोचकर मूर्ख न बनने दें कि यह एक साधारण डेटाबेस है। उन कीज़ और वैल्यू को स्टोर और पुनः प्राप्त करने के बहुत सारे तरीके हैं।
आपको Redis की आवश्यकता क्यों है?
आप Redis का कई तरीकों से उपयोग कर सकते हैं। लेकिन मैं दो मुख्य कारणों के बारे में सोच सकता हूं:
- आप एक ऐसा एप्लिकेशन बना रहे हैं जहां आप अपने कोड लेयर को स्टेटलेस बनाना चाहते हैं। क्यों? - क्योंकि यदि आपका कोड स्टेटलेस है, तो यह क्षैतिज रूप से स्केलेबल है। इसलिए, आप Redis को एक केंद्रीय स्टोरेज सिस्टम के रूप में उपयोग कर सकते हैं और अपने कोड को केवल लॉजिक संभालने दे सकते हैं।
- आप एक ऐसा एप्लिकेशन बना रहे हैं जहां कई ऐप्स को डेटा साझा करने की आवश्यकता हो सकती है। उदाहरण के लिए, क्या होगा यदि कोई
payments.codedamn.comपर आपकी साइट को ब्रूटफोर्स करने की कोशिश कर रहा है, और एक बार जब आप इसका पता लगा लेते हैं, तो आप उन्हेंlogin.codedamn.comपर भी ब्लॉक करना चाहेंगे? Redis आपके कई डिस्कनेक्टेड/लूजली कनेक्टेड सर्विसेज को एक कॉमन मेमोरी स्पेस साझा करने देता है।
Redis सीखना अपेक्षाकृत सरल है क्योंकि केवल कुछ ही कमांड हैं जिन्हें आपको जानना होगा। अगले कुछ सेक्शन में, हम कुछ मुख्य Redis अवधारणाओं और कुछ उपयोगी सामान्य कमांड को कवर करेंगे।
Redis CLI
Redis CLI का उपयोग करके कोडेडैम्न Redis कोर्स एक्सरसाइज में सिंपल PING या हेलो वर्ल्ड
Redis में एक CLI है जो कमांड लाइन का एक REPL संस्करण है। आप जो भी लिखेंगे उसका मूल्यांकन किया जाएगा।
उपरोक्त छवि आपको दिखाती है कि मेरे कोडेडैम्न Redis कोर्स एक्सरसाइज में से एक में Redis में एक साधारण PING या हेलो वर्ल्ड कैसे करें (यदि आप इसे देखना चाहते हैं तो कोर्स अंत में लिंक किया गया है)।
जब आप डेटाबेस के साथ एक एप्लिकेशन पर काम कर रहे होते हैं और जल्दी से कुछ कीज़ या Redis की स्थिति में झांकने की आवश्यकता होती है, तो यह Redis REPL बहुत उपयोगी होता है।
सामान्य Redis कमांड
कोडेडैम्न कोर्स में Redis CLI पर सामान्य कमांड आज़माना
यहां Redis में कुछ बहुत सामान्य रूप से उपयोग की जाने वाली कमांड हैं जो आपको इसके काम करने के तरीके के बारे में अधिक जानने में मदद करेंगी:
SET
SET आपको Redis में एक की को एक वैल्यू पर सेट करने की अनुमति देता है।
यहां एक उदाहरण है कि यह कैसे काम करता है:
SET mehul "developer from india"
यह की mehul को वैल्यू developer from india पर सेट करता है।
GET
GET आपको आपके द्वारा सेट की गई कीज़ प्राप्त करने की अनुमति देता है।
यहां सिंटैक्स है:
GET mehul
यह स्ट्रिंग "developer from india" लौटाएगा जैसा कि हमने ऊपर सेट किया था।
SETNX
यह की केवल तभी एक वैल्यू सेट करेगी जब की मौजूद न हो। इस कमांड के कई उपयोग के मामले हैं, जिसमें एक की के वैल्यू को गलती से ओवरराइट न करना शामिल है जो पहले से मौजूद हो सकती है।
यहां बताया गया है कि यह कैसे काम करता है:
SET key1 value1
SETNX key1 value2
SETNX key2 value2
इस उदाहरण को चलाने के बाद, आपके key1 में वैल्यू value1 होगी और key2 में value2 होगी। ऐसा इसलिए है क्योंकि दूसरी कमांड का कोई प्रभाव नहीं पड़ेगा क्योंकि key1 पहले से मौजूद था।
MSET
MSET SET की तरह है, लेकिन आप एक कमांड में एक साथ कई कीज़ सेट कर सकते हैं। यहां बताया गया है कि यह कैसे काम करता है:
MSET key1 "value1" key2 "value2" key3 "value3"
अभी हम कीज़ और वैल्यूज़ के लिए प्रीफिक्स के रूप में key और value का उपयोग कर रहे हैं। लेकिन वास्तव में जब आप ऐसा कोड लिखते हैं तो इतने लंबे कमांड में क्या की है और क्या वैल्यू है इसका ट्रैक खोना आसान है।
तो एक चीज जो आप कर सकते हैं वह है हमेशा अपने वैल्यू को डबल कोट्स का उपयोग करके कोट करें, और अपनी कीज़ को बिना कोट्स के छोड़ दें (यदि वे बिना कोट्स के वैध कीनेम हैं)।
MGET
MGET GET के समान है, लेकिन यह एक साथ कई वैल्यूज़ लौटा सकता है, जैसे:
MGET key1 key2 key3 key4
यह चार वैल्यूज़ को एक ऐरे के रूप में लौटाएगा: value1, value2, value3 और null। हमें key4 null मिला क्योंकि हमने इसे कभी सेट नहीं किया।
DEL
यह कमांड एक की को डिलीट करता है - काफी सरल, है ना?
यहां एक उदाहरण है:
SET key value
GET key # आपको "value" देता है
DEL key
GET key # null
INCR और DECR
आप इन दो कमांड का उपयोग एक की को बढ़ाने या घटाने के लिए कर सकते हैं जो एक नंबर है। ये बहुत उपयोगी हैं और आप इनका बहुत उपयोग करेंगे, क्योंकि Redis एक ही समय में दो ऑपरेशन कर सकता है - की प्राप्त करें और की को की + 1 पर सेट करें।
यह आपके पैरेंट एप्लिकेशन के राउंडट्रिप्स से बचाता है, और ऑपरेशन को ट्रांजैक्शन का उपयोग किए बिना सुरक्षित रूप से करने के लिए भी बनाता है (इस पर बाद में और अधिक)
यहां बताया गया है कि वे कैसे काम करते हैं:
SET favNum 10
INCR favNum # 11
INCR favNum # 12
DECR favNum # 11
EXPIRE
EXPIRE कमांड का उपयोग एक की पर एक्सपायरेशन टाइमर सेट करने के लिए किया जाता है। तकनीकी रूप से यह एक टाइमर नहीं है, बल्कि एक किल टाइमस्टैम्प है जिसके बाद की हमेशा null लौटाएगी जब तक कि इसे फिर से सेट न किया जाए।
SET bitcoin 100
EXPIRE bitcoin 10
GET bitcoin # 100
# 10 सेकंड बाद
GET bitcoin # null
EXPIRE उस की को समग्र रूप से स्टोर करने के लिए थोड़ी अधिक मेमोरी का उपयोग करता है (क्योंकि अब आपको यह भी स्टोर करना होगा कि वह की कब एक्सपायर होनी चाहिए)। लेकिन आप शायद उस ओवरहेड की कभी परवाह नहीं करेंगे।
TTL
इस कमांड का उपयोग यह जानने के लिए किया जा सकता है कि की को कितना समय जीवित रहना है।
उदाहरण:
SET bitcoin 100
TTL bitcoin # -1
TTL somethingelse # -2
EXPIRE bitcoin 5
# 2 सेकंड प्रतीक्षा करें
TTL bitcoin # 3 लौटाता है
# 1 सेकंड बाद
GET bitcoin # null
TTL bitcoin # -2
इस कोड से हम क्या सीख सकते हैं?
- TTL
-1लौटाएगा यदि की मौजूद है लेकिन इसकी कोई एक्सपायरी नहीं है - TTL
-2लौटाएगा यदि की मौजूद नहीं है - TTL सेकंड में टाइम टू लिव लौटाएगा यदि की मौजूद है और एक्सपायर होगी
SETEX
आप SETEX के साथ SET और EXPIRE को एक साथ कर सकते हैं।
इस तरह:
SETEX key 10 value
यहां, की "key" है, वैल्यू "value" है, और टाइम टू लिव (TTL) 10 है। यह की 10 सेकंड के बाद अनसेट हो जाएगी।
अब जब आपके पास बेसिक Redis कमांड और CLI कैसे काम करता है इसका मौलिक ज्ञान है, तो आइए कुछ प्रोजेक्ट बनाएं और उन टूल्स को वास्तविक जीवन में उपयोग करें।
प्रोजेक्ट 1 - Redis के साथ API कैशिंग सिस्टम बनाएं
कोडेडैम्न पर API कैशिंग सिस्टम बिल्डिंग लैब का पूर्वावलोकन
इस प्रोजेक्ट में Redis के साथ एक API कैशिंग सिस्टम सेट करना शामिल है, जहां आप एक थर्ड-पार्टी सर्वर से परिणामों को कैश करते हैं और कुछ समय के लिए इसका उपयोग करते हैं।
यह उपयोगी है ताकि आप उस थर्ड पार्टी द्वारा रेट लिमिटेड न हों। साथ ही, कैशिंग आपकी साइट की गति में सुधार करती है, इसलिए यदि आप इसे सही ढंग से लागू करते हैं तो यह सभी के लिए फायदे का सौदा है।
आप इस प्रोजेक्ट को कोडेडैम्न पर ब्राउज़र के अंदर इंटरैक्टिव रूप से Node.js का उपयोग करके बना सकते हैं। यदि आप रुचि रखते हैं, तो आप फ्री में API कैशिंग लैब आज़मा सकते हैं।
यदि आप केवल समाधान में रुचि रखते हैं (और इसे स्वयं नहीं बनाना चाहते) तो यहां Node.js में कोर लॉजिक कैसे काम करेगा:
app.post('/data', async (req, res) => {
const repo = req.body.repo
const value = await redis.get(repo)
if (value) {
// मतलब हमें कैश हिट मिला
res.json({ status: 'ok', stars: value })
return
}
const response = await fetch(`https://api.github.com/repos/${repo}`).then((t) => t.json())
if (response.stargazers_count != undefined) {
await redis.setex(repo, 60, response.stargazers_count)
}
res.json({ status: 'ok', stars: response.stargazers_count })
})
आइए देखें कि यहां क्या हो रहा है:
- हम अपने Redis कैश से
repo(जो पास किया गया रिपो फॉर्मेट है -facebook/react) प्राप्त करने का प्रयास करते हैं। यदि मौजूद है, तो बढ़िया! हम अपने Redis कैश से स्टार काउंट लौटाते हैं, जिससे हमें GitHub के सर्वर पर एक राउंडट्रिप की बचत होती है। - यदि हमें यह कैश में नहीं मिलता है, तो हम GitHub के सर्वर पर एक रिक्वेस्ट करते हैं, और स्टार काउंट प्राप्त करते हैं। हम जांचते हैं कि स्टार काउंट अपरिभाषित नहीं है (यदि कोई रिपो मौजूद नहीं है/निजी है)। यदि इसका कोई वैल्यू है, तो हम 60 सेकंड के टाइमआउट के साथ वैल्यू को
setexकरते हैं। - हम एक टाइमआउट सेट करते हैं क्योंकि हम समय के साथ बासी वैल्यू सर्व नहीं करना चाहते। यह हमें कम से कम मिनट में एक बार अपने स्टार काउंट को रिफ्रेश करने में मदद करता है।
प्रोजेक्ट 2 - Redis के साथ API रेट लिमिटिंग
Redis के साथ API रेट लिमिटिंग का पूर्वावलोकन
इस प्रोजेक्ट में एक निश्चित एंडपॉइंट को खराब अभिनेताओं से बचाने के लिए रेट लिमिटिंग करना शामिल है, और फिर उन्हें उस विशेष API तक पहुंचने से रोकना।
यह लॉगिन और संवेदनशील API एंडपॉइंट के लिए बहुत उपयोगी है, जहां आप नहीं चाहते कि एक ही व्यक्ति आपके एंडपॉइंट को हजारों रिक्वेस्ट से हिट करे।
हम इस लैब में IP पते द्वारा रेट लिमिटिंग करते हैं। यदि आप इस कोडलैब को आज़माना चाहते हैं, तो आप इसे कोडेडैम्न पर फ्री में आज़मा सकते हैं।
यदि आप केवल समाधान में रुचि रखते हैं (और इसे स्वयं नहीं बनाना चाहते) तो यहां Node.js में कोर लॉजिक कैसे काम करेगा:
app.post('/api/route', async (req, res) => {
// यहां डेटा जोड़ें
const ip = req.headers['x-forwarded-for'] || req.ip
const reqs = await redis.incr(ip)
await redis.expire(ip, 2)
if (reqs > 15) {
return res.json({ status: 'rate-limited' })
} else if (reqs > 10) {
return res.json({ status: 'about-to-rate-limit' })
} else {
res.json({ status: 'ok' })
}
})
आइए इस कोड ब्लॉक को समझें:
- हम
x-forwarded-forहेडर से IP निकालने का प्रयास करते हैं (या आपreq.ipका उपयोग कर सकते हैं क्योंकि हम एक्सप्रेस का उपयोग कर रहे हैं) - हम IP एड्रेस फ़ील्ड को
INCRकरते हैं। यदि Redis में हमारी की कभी मौजूद नहीं थी, तो INCR स्वचालित रूप से इसे 0 पर सेट कर देगा और बढ़ाएगा, जो अंततः इसे 1 पर सेट कर देगा। - हम की को 2 सेकंड में एक्सपायर होने के लिए सेट करते हैं। आदर्श रूप से आप एक बड़ा मान चाहेंगे - लेकिन यह वही है जो ऊपर कोडेडैम्न चैलेंज में निर्दिष्ट था, तो वहां हमारे पास है।
- अंत में हम रिक्वेस्ट काउंट की जांच करते हैं, यदि वे एक निश्चित थ्रेशोल्ड से अधिक हैं, तो हम रिक्वेस्ट को मुख्य फंक्शन बॉडी तक पहुंचने से रोकते हैं।
Redis पर अधिक
Redis अब तक हमने जो सीखा है उससे कहीं अधिक है। लेकिन अच्छी बात यह है कि हमने इसके साथ काम करना शुरू करने के लिए पर्याप्त सीख लिया है!
इस सेक्शन में, आइए कुछ और Redis फंडामेंटल्स को कवर करें।
Redis सिंगल-थ्रेडेड है
Redis एक सिंगल-थ्रेडेड प्रक्रिया के रूप में चलता है, यहां तक कि मल्टी-थ्रेडिंग का समर्थन करने वाले मल्टीपल कोर सिस्टम पर भी। यह एक प्रदर्शन दुःस्वप्न नहीं है, बल्कि मल्टी-थ्रेडेड एनवायरनमेंट में असंगत रीड/राइट के खिलाफ एक सुरक्षा उपाय है।
यदि Redis मल्टी-थ्रेडेड होता, तो एक सिंगल की तक पहुंचते समय थ्रेड सुरक्षा सुनिश्चित करने के लिए, आप अंततः किसी लॉकिंग मैकेनिज्म का सहारा लेते, जो शायद सिंगल-थ्रेडेड/सीक्वेंशियल एक्सेस से भी खराब प्रदर्शन करता।
Redis ट्रांजैक्शन
बेशक, आप Redis में सब कुछ एक सिंगल कमांड में नहीं कर सकते। लेकिन आप निश्चित रूप से इसे एक ब्लॉक में कमांड करने के लिए कह सकते हैं (यानी, कोई और Redis से बात नहीं करता जब वह उस ब्लॉक को निष्पादित कर रहा होता है)। आप इसे MULTI कमांड का उपयोग करके कर सकते हैं।
यहां बताया गया है कि यह कैसे काम करता है:
MULTI
SET hello world
SET yo lo
SET number 1
INCR number
EXPIRE hello 10
EXPIRE yo 5
EXEC
यह इन सभी ऑपरेशन्स को एक बार में करेगा, यानी यह MULTI के बाद कुछ भी नहीं चलाएगा, और EXEC कीवर्ड देखते ही सब कुछ एक साथ चलाएगा।
Redis अधिक उन्नत उपयोग के मामलों के लिए लिस्ट्स और सेट्स के लिए सपोर्ट शामिल करता है। आप Redis को एक ब्रॉडकास्टिंग सर्विस के रूप में भी उपयोग कर सकते हैं जहां आप एक चैनल पर पब्लिश करते हैं और अन्य जिन्होंने चैनल को सब्सक्राइब किया है उन्हें एक नोटिफिकेशन प्राप्त होता है। यह मल्टी-क्लाइंट आर्किटेक्चर में बहुत उपयोगी है।
निष्कर्ष
मुझे आशा है कि आपको Redis का यह परिचय पसंद आया होगा। यह ब्लॉग पोस्ट कोडेडैम्न के नए इंटरैक्टिव कोर्स का एक हिस्सा है: Redis + Node.js कैशिंग, जहां आप न केवल इन अवधारणाओं के बारे में सीखते हैं, बल्कि चलते-फिरते अपने ब्राउज़र में उनका अभ्यास करते हैं।
कोर्स को आज़माने के लिए स्वतंत्र महसूस करें और मुझे बताएं कि आप क्या सोचते हैं। आप मुझे ट्विटर पर फीडबैक भेजने के लिए ढूंढ सकते हैं :)
मुफ़्त में कोड करना सीखें। freeCodeCamp का ओपन सोर्स पाठ्यक्रम 40,000 से अधिक लोगों को डेवलपर के रूप में नौकरी पाने में मदद कर चुका है। शुरू करें