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

रेडिस में महारत हासिल करना:सीएलआई अनिवार्यताएं, मुख्य कमांड और व्यावहारिक परियोजनाएं

रेडिस में महारत हासिल करना:सीएलआई अनिवार्यताएं, मुख्य कमांड और व्यावहारिक परियोजनाएं <पी> मेहुल मोहन

द्वारा <पी> रेडिस एक लोकप्रिय इन-मेमोरी डेटाबेस है जिसका उपयोग कैशिंग और रेट लिमिटिंग जैसी विभिन्न परियोजनाओं के लिए किया जाता है।

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

इन-मेमोरी डेटाबेस क्या है?

<पी> पारंपरिक डेटाबेस तेज़ पहुंच के लिए डेटाबेस का एक हिस्सा (आमतौर पर "हॉट" या अक्सर एक्सेस किए जाने वाले सूचकांक) को मेमोरी में रखते हैं, और बाकी डेटाबेस को डिस्क पर रखते हैं। <पी> दूसरी ओर, रेडिस विलंबता और डेटा की तेज़ पुनर्प्राप्ति और भंडारण पर बहुत अधिक ध्यान केंद्रित करता है। इसलिए यह स्टोरेज डिवाइस (SSD/HDD) के बजाय पूरी तरह से मेमोरी (RAM) पर काम करता है। गति महत्वपूर्ण है!

<पी> रेडिस एक कुंजी-मूल्य डेटाबेस है। लेकिन यह सोचकर मूर्ख मत बनिए कि यह एक साधारण डेटाबेस है। आपके पास उन कुंजियों और मूल्यों को संग्रहीत करने और पुनः प्राप्त करने के कई तरीके हैं।

आपको रेडिस की आवश्यकता क्यों है?

<पी> आप रेडिस का उपयोग कई तरीकों से कर सकते हैं। लेकिन मैं दो मुख्य कारणों के बारे में सोच सकता हूं:

  1. आप एक एप्लिकेशन बना रहे हैं जहां आप अपनी कोड परत को स्टेटलेस बनाना चाहते हैं। क्यों? - क्योंकि यदि आपका कोड स्टेटलेस है, तो यह क्षैतिज रूप से स्केलेबल है। इसलिए, आप रेडिस को एक केंद्रीय भंडारण प्रणाली के रूप में उपयोग कर सकते हैं और अपने कोड को केवल तर्क को संभालने दे सकते हैं।
  2. आप एक एप्लिकेशन बना रहे हैं जहां एकाधिक ऐप्स को डेटा साझा करने की आवश्यकता हो सकती है। उदाहरण के लिए, यदि कोई आपकी साइट पर payments.codedamn.com पर जबरदस्ती करने का प्रयास कर रहा है तो क्या होगा , और एक बार जब आप इसका पता लगा लेंगे, तो आप उन्हें login.codedamn.com पर ब्लॉक करना भी चाहेंगे ? रेडिस आपकी कई डिस्कनेक्टेड/ढीले से जुड़ी सेवाओं को एक सामान्य मेमोरी स्पेस साझा करने देता है।
<पी> रेडिस को सीखना अपेक्षाकृत सरल है क्योंकि इसमें केवल कुछ ही कमांड हैं जिन्हें आपको जानना होगा। अगले कुछ अनुभागों में, हम कुछ मुख्य रेडिस अवधारणाओं और कुछ उपयोगी सामान्य कमांडों को कवर करेंगे।

रेडिस सीएलआई

<पी> रेडिस में महारत हासिल करना:सीएलआई अनिवार्यताएं, मुख्य कमांड और व्यावहारिक परियोजनाएं

<पी> रेडिस में एक सीएलआई है जो कमांड लाइन का आरईपीएल संस्करण है। आप जो भी लिखेंगे उसका मूल्यांकन किया जाएगा. <पी> उपरोक्त छवि आपको दिखाती है कि एक सरल PING कैसे करें या मेरे कोडेड रेडिस पाठ्यक्रम अभ्यासों में से एक में रेडिस में हैलो वर्ल्ड (यदि आप इसे देखना चाहते हैं तो पाठ्यक्रम अंत में लिंक किया गया है)।

<पी> यह रेडिस आरईपीएल तब बहुत उपयोगी होता है जब आप किसी एप्लिकेशन में डेटाबेस के साथ काम कर रहे होते हैं और आपको तुरंत कुछ कुंजियों या रेडिस की स्थिति पर एक नज़र डालने की आवश्यकता होती है।

सामान्य रेडिस कमांड

<पी> रेडिस में महारत हासिल करना:सीएलआई अनिवार्यताएं, मुख्य कमांड और व्यावहारिक परियोजनाएं कोडेडम कोर्स में Redis CLI पर सामान्य कमांड आज़मा रहा है <पी> यहां Redis में आमतौर पर उपयोग किए जाने वाले कुछ कमांड दिए गए हैं, जिससे आपको यह जानने में मदद मिलेगी कि यह कैसे काम करता है:

सेट

<पी> SET आपको Redis में किसी मान के लिए एक कुंजी सेट करने की अनुमति देता है।

<पी> यह कैसे काम करता है इसका एक उदाहरण यहां दिया गया है:

SET mehul "developer from india"
<पी> यह कुंजी mehul सेट करता है मान developer from india पर .

प्राप्त करें

<पी> GET आपको आपके द्वारा सेट की गई कुंजियाँ प्राप्त करने की अनुमति देता है।

<पी> यहाँ वाक्यविन्यास है:

GET mehul
<पी> जैसा कि हमने ऊपर सेट किया है, यह "भारत से डेवलपर" स्ट्रिंग लौटाएगा।

SETNX

<पी> यह कुंजी केवल तभी मान सेट करेगी जब कुंजी मौजूद न हो। इस कमांड में कई उपयोग के मामले हैं, जिसमें पहले से मौजूद कुंजी के मान को गलती से ओवरराइट नहीं करना भी शामिल है।

<पी> यहां बताया गया है कि यह कैसे काम करता है:

SET key1 value1
SETNX key1 value2
SETNX key2 value2
<पी> इस उदाहरण को चलाने के बाद, आपका key1 का मान value1 होगा और key2 value2 के रूप में . ऐसा इसलिए है क्योंकि दूसरे कमांड का key1 के रूप में कोई प्रभाव नहीं पड़ेगा पहले से ही मौजूद था.

एमसेट

<पी> MSET SET की तरह है, लेकिन आप एक कमांड में कई कुंजियाँ एक साथ सेट कर सकते हैं। यहां बताया गया है कि यह कैसे काम करता है:

MSET key1 "value1" key2 "value2" key3 "value3"
<पी> अभी हम key का उपयोग कर रहे हैं और value कुंजियों और मानों के लिए उपसर्ग के रूप में। लेकिन वास्तव में जब आप ऐसा कोड लिखते हैं तो यह पता लगाना आसान होता है कि इतने लंबे कमांड में कुंजी क्या है और मूल्य क्या है। <पी> तो एक चीज जो आप कर सकते हैं वह यह है कि हमेशा दोहरे उद्धरण चिह्नों का उपयोग करके अपना मूल्य उद्धृत करें, और अपनी कुंजियों को बिना उद्धरण चिह्नों के छोड़ दें (यदि वे उद्धरण चिह्नों के बिना वैध कुंजीनाम हैं)।

MGET

<पी> MGET GET के समान है, लेकिन यह एक साथ कई मान लौटा सकता है, जैसे:

MGET key1 key2 key3 key4
<पी> यह एक सरणी के रूप में चार मान लौटाएगा:value1 , value2 , value3 और null . हमें key4 मिला शून्य के रूप में क्योंकि हमने इसे कभी सेट नहीं किया।

DEL

<पी> यह आदेश एक कुंजी को हटा देता है - काफी सरल है, है ना?

<पी> यहाँ एक उदाहरण है:

SET key value
GET key # gives you "value"
DEL key 
GET key # null

INCR और DECR

<पी> आप इन दो आदेशों का उपयोग किसी कुंजी को बढ़ाने या घटाने के लिए कर सकते हैं जो एक संख्या है। वे बहुत उपयोगी हैं और आप उनका बहुत उपयोग करेंगे, क्योंकि रेडिस एक में दो ऑपरेशन कर सकता है - कुंजी प्राप्त करें और कुंजी + 1 पर कुंजी सेट करें।

<पी> यह आपके मूल एप्लिकेशन के चक्कर लगाने से बचाता है, और लेन-देन का उपयोग किए बिना ऑपरेशन को सुरक्षित बनाता है (इस पर बाद में अधिक जानकारी)

<पी> यहां बताया गया है कि वे कैसे काम करते हैं:

SET favNum 10
INCR favNum # 11
INCR favNum # 12
DECR favNum # 11

समाप्त

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

SET bitcoin 100
EXPIRE bitcoin 10
GET bitcoin # 100
# after 10 seconds
GET bitcoin # null
<पी> EXPIRE उस कुंजी को संपूर्ण रूप से संग्रहीत करने के लिए थोड़ी अधिक मेमोरी का उपयोग करता है (क्योंकि अब आपको उस कुंजी को समाप्त होने पर भी संग्रहीत करना होगा)। लेकिन आप शायद कभी भी उस ओवरहेड की परवाह नहीं करेंगे।

टीटीएल

<पी> इस कमांड का उपयोग यह जानने के लिए किया जा सकता है कि कुंजी को कितने समय तक जीवित रहना है।

<पी> उदाहरणः

SET bitcoin 100
TTL bitcoin # -1
TTL somethingelse # -2
EXPIRE bitcoin 5
# wait 2 seconds
TTL bitcoin # returns 3
# after 1 second
GET bitcoin # null
TTL bitcoin # -2
<पी> तो हम इस कोड से क्या सीख सकते हैं?

  1. टीटीएल -1 लौटाएगा यदि कुंजी मौजूद है लेकिन उसकी समाप्ति तिथि नहीं है
  2. टीटीएल -2 लौटाएगा यदि कुंजी मौजूद नहीं है
  3. यदि कुंजी मौजूद है और समाप्त हो जाएगी तो TTL सेकंडों में लाइव होने का समय लौटा देगा

SETEX

<पी> आपसेटकर सकते हैं और समाप्त SETEX के साथ .

<पी> इस तरह:

SETEX key 10 value
<पी> यहां, कुंजी "कुंजी" है, मान "मान" है, और जीने का समय (टीटीएल) 10 है। यह कुंजी 10 सेकंड के बाद अनसेट हो जाएगी।

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

परियोजना 1 - रेडिस के साथ एक एपीआई कैशिंग सिस्टम बनाएं

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

<पी> आप इस प्रोजेक्ट को Node.js का उपयोग करके ब्राउज़र के अंदर कोडडैम पर इंटरैक्टिव तरीके से बना सकते हैं। यदि आप रुचि रखते हैं, तो आप एपीआई कैशिंग लैब को निःशुल्क आज़मा सकते हैं।

<पी> यदि आप केवल समाधान में रुचि रखते हैं (और इसे स्वयं नहीं बना रहे हैं) तो यहां बताया गया है कि मुख्य तर्क Node.js में कैसे काम करेगा:

app.post('/data', async (req, res) => {
 const repo = req.body.repo
 const value = await redis.get(repo)
 if (value) {
 // means we got a cache hit
 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
 })
})
<पी> आइए देखें यहां क्या हो रहा है:

  • हम repo प्राप्त करने का प्रयास करते हैं (जो पारित रेपो प्रारूप है - facebook/react ) हमारे रेडिस कैश से। यदि मौजूद है, तो बढ़िया! हम अपने रेडिस कैश से स्टार काउंट लौटाते हैं, जिससे हमें GitHub के सर्वर पर एक राउंडट्रिप की बचत होती है।
  • यदि हमें यह कैश में नहीं मिलता है, तो हम GitHub के सर्वर से अनुरोध करते हैं, और स्टार गिनती प्राप्त करते हैं। हम जांचते हैं कि क्या स्टार गिनती अपरिभाषित नहीं है (यदि कोई रेपो मौजूद नहीं है/निजी है)। यदि इसका कोई मान है, तो हम setex करते हैं 60 सेकंड के टाइमआउट के साथ मान।
  • हमने एक टाइमआउट निर्धारित किया है क्योंकि हम समय के साथ पुराने मूल्यों की सेवा नहीं करना चाहते हैं। इससे हमें प्रति मिनट कम से कम एक बार अपने स्टार काउंट को ताज़ा करने में मदद मिलती है।
<पी> यहां पूरा स्रोत कोड है:

प्रोजेक्ट 2 - रेडिस के साथ दर सीमित करने वाली एपीआई

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

<पी> हम इस प्रयोगशाला में आईपी पते द्वारा दर सीमित करते हैं। यदि आप इस कोडलैब को आज़माना चाहते हैं, तो आप इसे कोडडैम पर निःशुल्क आज़मा सकते हैं।

<पी> यदि आप केवल समाधान में रुचि रखते हैं (और इसे स्वयं नहीं बना रहे हैं) तो यहां बताया गया है कि मुख्य तर्क Node.js में कैसे काम करेगा:

app.post('/api/route', async (req, res) => {
 // add data here
 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 से आईपी निकालने का प्रयास करते हैं हेडर (या आप req.ip का उपयोग कर सकते हैं जैसा कि हम एक्सप्रेस का उपयोग कर रहे हैं)
  • हम INCR आईपी पता फ़ील्ड. यदि रेडिस में हमारी कुंजी कभी अस्तित्व में नहीं थी, तो INCR स्वचालित रूप से इसे 0 पर सेट कर देगा और वेतन वृद्धि, यानी अंततः इसे 1 पर सेट कर देगा।
  • हमने कुंजी को 2 सेकंड में समाप्त होने के लिए सेट किया है। आदर्श रूप से आप एक बड़ा मूल्य चाहते हैं - लेकिन ऊपर निर्दिष्ट कोडडैम चुनौती यही है, इसलिए हमारे पास यह है।
  • अंत में हम अनुरोधों की संख्या की जांच करते हैं, यदि वे एक निश्चित सीमा से अधिक हैं, तो हम अनुरोध को मुख्य फ़ंक्शन बॉडी तक पहुंचने से रोकते हैं।
<पी> यहां पूरा समाधान है:

रेडिस पर अधिक जानकारी

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

रेडिस सिंगल थ्रेडेड है

<पी> रेडिस एकल थ्रेडेड प्रक्रिया के रूप में चलता है, यहां तक कि मल्टी थ्रेडिंग का समर्थन करने वाले मल्टीपल कोर सिस्टम पर भी। यह कोई प्रदर्शन दुःस्वप्न नहीं है, बल्कि बहु-थ्रेडेड वातावरण में असंगत पढ़ने/लिखने के विरुद्ध एक सुरक्षा उपाय है। <पी> यदि रेडिस मल्टी थ्रेडेड होता, तो एकल कुंजी तक पहुंचने पर थ्रेड सुरक्षा सुनिश्चित करने के लिए, आपको अंततः कुछ लॉकिंग तंत्र का समाधान करना पड़ता, जो संभवतः सिंगल थ्रेडेड/अनुक्रमिक एक्सेस से भी बदतर प्रदर्शन करता।

रेडिस लेनदेन

<पी> बेशक, आप रेडिस में एक ही कमांड में सब कुछ नहीं कर सकते। लेकिन आप निश्चित रूप से इसे एक बार में कमांड का ब्लॉक करने के लिए कह सकते हैं (अर्थात, उस ब्लॉक को निष्पादित करते समय कोई भी रेडिस से बात नहीं करता है)। आप MULTI का उपयोग करके ऐसा कर सकते हैं आदेश.

<पी> यहां बताया गया है कि यह कैसे काम करता है:

MULTI
SET hello world
SET yo lo
SET number 1
INCR number
EXPIRE hello 10
EXPIRE yo 5
EXEC
<पी> यह इन सभी ऑपरेशनों को एक ही बार में निष्पादित कर देगा, अर्थात ऐसा करेगा MULTI के बाद कुछ भी चलाएं , और EXEC देखते ही सब कुछ एक साथ चला देगा कीवर्ड.

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

निष्कर्ष

<पी> मुझे आशा है कि आपको रेडिस का यह परिचय पसंद आया होगा। यह ब्लॉग पोस्ट कोडडेमन के नए इंटरैक्टिव कोर्स का एक हिस्सा है:रेडिस + नोड.जेएस कैशिंग, जहां आप न केवल इन अवधारणाओं के बारे में सीखते हैं, बल्कि चलते-फिरते अपने ब्राउज़र में उनका अभ्यास भी करते हैं। <पी> बेझिझक इस कोर्स को आज़माएं और मुझे बताएं कि आप क्या सोचते हैं। कोई भी प्रतिक्रिया भेजने के लिए आप मुझे ट्विटर पर पा सकते हैं :)

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


  1. आईफोन/आईओएस में प्रोग्रामेटिक रूप से स्क्रीनशॉट कैसे लें? आईफोन/आईओएस में प्रोग्रामेटिक रूप से स्क्रीनशॉट कैसे लें?

    हालांकि आईओएस, आईओएस डिवाइस पर प्रोग्रामेटिक रूप से स्क्रीनशॉट लेने का कोई आधिकारिक तरीका प्रदान नहीं करता है, यह एक ही समय में दोनों को दबाकर, होम और पावर बटन का उपयोग करके स्क्रीनशॉट लेने का एक तरीका प्रदान करता है। स्क्रीनशॉट लेने के लिए, हमें कई चरणों से गुज़रना होगा। हमें keyWindow की परत म

  1. एचटीएमएल डोम स्टाइल एनिमेशनप्लेस्टेट प्रॉपर्टी एचटीएमएल डोम स्टाइल एनिमेशनप्लेस्टेट प्रॉपर्टी

    एनीमेशनप्लेस्टेट संपत्ति का उपयोग एनीमेशन स्थिति को सेट करने या प्राप्त करने के लिए किया जाता है चाहे वह चल रहा हो या रोका गया हो। यह एनिमेशन को टॉगल करने में उपयोगी है। सिंटैक्स . के लिए सिंटैक्स निम्नलिखित है एनीमेशनप्लेस्टेट प्रॉपर्टी सेट करना - object.style.animationPlayState = "running|

  1. Python और Matplotlib का उपयोग करके 3D स्कैटर प्लॉट पर अल्फा मान को नियंत्रित करना Python और Matplotlib का उपयोग करके 3D स्कैटर प्लॉट पर अल्फा मान को नियंत्रित करना

    Python और Matplotlib का उपयोग करके 3D स्कैटर प्लॉट पर अल्फा मान को नियंत्रित करने के लिए, हम facecolor और edgecolors मान सेट कर सकते हैं। आकृति का आकार सेट करें और सबप्लॉट के बीच और आसपास पैडिंग समायोजित करें। एक नया आंकड़ा बनाएं या आंकड़ा () . का उपयोग करके मौजूदा आंकड़े को सक्रिय करें विधि। एक ~.