रेडिस की सबसे अच्छी अनसंग विशेषताओं में से एक इसका वायर प्रोटोकॉल है। यही कारण है कि रेडिस के पास उच्च गुणवत्ता वाले क्लाइंट लाइब्रेरी का सबसे बड़ा पारिस्थितिकी तंत्र है। रेडिस वायर प्रोटोकॉल उल्लेखनीय रूप से सरल है, जो एक क्लाइंट बनाना आसान बनाता है जो रेडिस की सभी प्रमुख विशेषताओं को लागू करता है। इसे इस तरह से भी डिज़ाइन किया गया है जिससे तेज़ और कुशल क्लाइंट लाइब्रेरी लिखना आसान हो जाता है।
आरईएसपी क्या है?
आरईएसपी (आरई डिस एस क्रमांकन P रोटोकॉल) टेक्स्ट-आधारित प्रोटोकॉल का नाम है जिसका उपयोग रेडिस क्लाइंट और सर्वर एक दूसरे के साथ ओवरटीसीपी के साथ संवाद करने के लिए करते हैं। सर्वर और क्लाइंट के बीच सभी संचार में पाँच बुनियादी प्रकार होते हैं:
- साधारण तार सामान्य सर्वर उत्तरों के लिए उपयोग किया जाता है जैसे "ओके" (सफल लेखन कमांड के बाद) या "पोंग" (पिंगकमांड की सफल प्रतिक्रिया)।
- बल्क स्ट्रिंग्स लगभग सभी सिंगल-वैल्यू रीड कमांड जैसे GET, LPOP, और HGET के लिए लौटाए जाते हैं। बल्क स्ट्रिंग्स साधारण स्ट्रिंग्स से भिन्न होती हैं, जिसमें उनमें कुछ भी शामिल हो सकता है — न्यूलाइन्स, कंट्रोल कैरेक्टर्स, या यहां तक कि मान्य आरईएसपी, सभी बिना बच या एन्कोड किए।
- पूर्णांक किसी भी प्रकार के काउंटिंग कमांड जैसे कि STRLEN, HLEN, या BITCOUNT के उत्तर के रूप में उपयोग किया जाता है।
- सरणी अन्य सरणियों सहित किसी भी संख्या में RESP ऑब्जेक्ट हो सकते हैं। इसका उपयोग सर्वर को कमांड भेजने के लिए किया जाता है, साथ ही किसी भी उत्तर के लिए जो एक से अधिक तत्व जैसे HGETALL, LRANGE, या MGET देता है।
- त्रुटियां जब भी रेडिस आपके कमांड को हैंडल करते समय किसी त्रुटि का सामना करता है, जैसे कि गलत प्रकार के डेटा रखने वाली कुंजी के विरुद्ध कमांड चलाने का प्रयास करते समय वापस लौटा दिया जाता है।
आरईएसपी लिखते और पढ़ते समय, हमें अपनी चाबियों या मूल्यों से बचने या एन्कोडिंग करने की आवश्यकता नहीं होती है। आरईएसपी का एकमात्र हिस्सा जिसे हमें वास्तव में पार्स करने की आवश्यकता है वह है प्रत्येक आरईएसपी ऑब्जेक्ट के साथ शामिल सरल मेटाडेटा।
आरईएसपी कैसा दिखता है?
सभी RESP ऑब्जेक्ट एक उपसर्ग वर्ण से शुरू होते हैं और एक लाइन टर्मिनेटर के साथ समाप्त होते हैं (सरणी को छोड़कर, जिसमें उनका अपना लाइन टर्मिनेटर शामिल नहीं होता है)। RESP ऑब्जेक्ट का सबसे सरल उदाहरण है OK
सरल स्ट्रिंग प्रतिक्रिया:
+OK\r\n
(आरईएसपी एक मानव-पठनीय प्रोटोकॉल है लेकिन स्पष्टता के लिए मैं स्पष्ट रूप से लाइन ब्रेक (\r\n
लिखूंगा) ) सभी आरईएसपी उदाहरणों में।)
उपरोक्त सरल स्ट्रिंग में, +
सरल स्ट्रिंग उपसर्ग है, OK
सरल स्ट्रिंग का शरीर है, और \r\n
लाइन टर्मिनेटर है जो इस सरल स्ट्रिंग के अंत को चिह्नित करता है।
एक साधारण स्ट्रिंग को पढ़ने के लिए, हम अगले \r\n
. तक पढ़ते हैं लाइनटर्मिनेटर, पूर्ववर्ती बाइट्स लौटाता है (+
. तक) ) लौटाए गए उत्तरस्ट्रिंग के रूप में। यह काम करता है क्योंकि आरईएसपी सरल स्ट्रिंग्स में कोई भी न्यूलाइन वर्ण शामिल नहीं हो सकता है।
त्रुटियों और पूर्णांकों को साधारण स्ट्रिंग्स के समान स्वरूपित किया जाता है, लेकिन वे विभिन्न उपसर्गों का उपयोग करते हैं। त्रुटियों के आगे -
. लगा होता है :
-ERR unknown command 'GETT'\r\n
और पूर्णांकों के आगे :
. लगा होता है :
:99\r\n
थोक तार इस मायने में अद्वितीय हैं कि उनके दो भाग हैं। एक लंबाई विनिर्देश और एक शरीर:
$13\r\nHello, World!\r\n
$
बल्क स्ट्रिंग उपसर्ग है, 13
वास्तविक स्ट्रिंगबॉडी में बाइट्स की संख्या है, और फिर \r\n
लंबाई विनिर्देश समाप्त करता है। Hello, World!
13 बाइट स्ट्रिंग बॉडी है, और वह भी \r\n
. के साथ समाप्त हो जाती है (जो स्ट्रिंग बॉडी का हिस्सा नहीं है)।
चूंकि बल्क स्ट्रिंग कंटेनर शरीर के लिए एक सटीक लंबाई प्रदान करता है, इसलिए हमें अंत खोजने के लिए वास्तविक स्ट्रिंग बॉडी को पार्स करना पड़ता है - हम स्ट्रिंग की सामग्री का निरीक्षण किए बिना सॉकेट से एक और 13 बाइट्स (प्लस फाइनल लाइन टर्मिनेटर) पढ़ सकते हैं। इसका मतलब है कि हम किसी भी डेटा का उपयोग कर सकते हैं जो हम स्ट्रिंग के शरीर में सामग्री को एन्कोडिंग या एस्केप किए बिना उपयोग कर सकते हैं।
सरणी भी लंबाई विनिर्देश के साथ शुरू होती है, सिवाय लंबाई फ़ील्ड सरणी की सामग्री में बाइट्स की संख्या के बजाय सरणी में ऑब्जेक्ट्स की संख्या को इंगित करती है।
*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
उपरोक्त उदाहरण में, हमारे पास एक सरणी है जिसमें दो बल्क स्ट्रिंग हैं (foo
औरbar
) जबकि सरणी लंबाई विनिर्देश हमें उस तरह से आगे बढ़ने की अनुमति नहीं देता है जैसा कि हम बल्क स्ट्रिंग को पढ़ते समय कर सकते हैं, यह हमारे क्लाइंट में सरणियों को लागू करना आसान बनाता है। हम सरणी के आकार को पढ़ते हैं, कई और ऑब्जेक्ट पढ़ते हैं, और फिर उन सभी ऑब्जेक्ट को अंतिम सरणी में वापस कर देते हैं।
सभी रेडिस कमांड को बल्क स्ट्रिंग्स के सरणियों के रूप में भेजा जाता है। उदाहरण के लिए, "सेट मायकी 'माय वैल्यू'" कमांड को लिखा और भेजा जाएगा:
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$8\r\nmy value\r\n
आगे RESP विवरण
आरईएसपी में उपयोग की जाने वाली उपसर्ग लंबाई पार्सर्स को जटिल राज्य मॉडलिंग या डेटा के माध्यम से एकाधिक पास करने की आवश्यकता के बिना कार्यान्वित करने की अनुमति देती है, जिससे बहुत तेज़ पार्सर्स बनाए जा सकते हैं।
ऐसे कई विवरण हैं जिन्हें मैंने यहां कवर नहीं किया है, जैसे कि नल बल्क स्ट्रिंग्स और अशक्त सरणियाँ। अधिक जानकारी के लिए, आधिकारिक दस्तावेज़ीकरण (हमेशा की तरह) में RESP के लिए एक बहुत ही पठनीय और व्यापक दस्तावेज़ीकरण पृष्ठ है।
प्रोटोकॉल को बेहतर ढंग से समझने का एक शानदार तरीका है कि आप स्वयं एक साधारण क्लाइंट को लागू करने का प्रयास करें। रेडिस प्रोटोकॉल को पढ़ने और लिखने के लिए हमारी मार्गदर्शिका देखें, आगे बढ़ें।