Redis की सबसे अच्छी अनसंग विशेषताओं में से एक इसका वायर प्रोटोकॉल है। यही कारण है कि Redis के पास हाई-क्वालिटी क्लाइंट लाइब्रेरीज़ के सबसे बड़े इकोसिस्टम में से एक है। Redis वायर प्रोटोकॉल उल्लेखनीय रूप से सरल है, जो एक क्लाइंट बनाने में आसान बनाता है जो Redis की सभी प्रमुख विशेषताओं को लागू करता है। यह इस तरह से भी डिज़ाइन किया गया है जो तेज़ और कुशल क्लाइंट लाइब्रेरीज़ लिखना आसान बनाता है।
RESP क्या है?
RESP (REdis Serialization Protocol) उस टेक्स्ट-आधारित प्रोटोकॉल का नाम है जिसका उपयोग Redis क्लाइंट्स और सर्वर्स TCP पर एक दूसरे के साथ संवाद करने के लिए करते हैं। सर्वर और क्लाइंट के बीच सभी संचार में पांच बुनियादी प्रकार होते हैं:
- सिंपल स्ट्रिंग्स का उपयोग सामान्य सर्वर रिप्लाई के लिए किया जाता है जैसे "OK" (सफल राइट कमांड के बाद) या "PONG" (PING कमांड की सफल प्रतिक्रिया)।
- बल्क स्ट्रिंग्स लगभग सभी सिंगल-वैल्यू रीड कमांड्स जैसे GET, LPOP, और HGET के लिए लौटाए जाते हैं। बल्क स्ट्रिंग्स सिंपल स्ट्रिंग्स से अलग हैं क्योंकि उनमें कुछ भी हो सकता है - न्यूज़लाइन, कंट्रोल कैरेक्टर्स, या यहां तक कि वैलिड RESP, सभी बिना एस्केप या एन्कोड किए।
- इंटीजर्स किसी भी प्रकार की काउंटिंग कमांड जैसे STRLEN, HLEN, या BITCOUNT के रिप्लाई के रूप में उपयोग किए जाते हैं।
- ऐरे किसी भी संख्या में RESP ऑब्जेक्ट्स को समाहित कर सकते हैं, जिनमें अन्य ऐरे भी शामिल हैं। इसका उपयोग सर्वर को कमांड्स भेजने के लिए किया जाता है, साथ ही किसी भी रिप्लाई के लिए जो एक से अधिक एलिमेंट लौटाता है जैसे HGETALL, LRANGE, या MGET।
- एरर्स तब लौटाए जाते हैं जब Redis आपकी कमांड को हैंडल करते समय एरर का सामना करता है, जैसे गलत प्रकार के डेटा को रखने वाली की पर कमांड चलाने की कोशिश करना।
RESP लिखते और पढ़ते समय, हमें अपनी कीज़ या वैल्यूज़ के किसी भी एस्केपिंग या एन्कोडिंग करने की आवश्यकता नहीं है। RESP का एकमात्र हिस्सा जिसे हमें वास्तव में पार्स करने की आवश्यकता है, वह प्रत्येक RESP ऑब्जेक्ट के साथ शामिल सिंपल मेटाडेटा है।
RESP कैसा दिखता है?
सभी RESP ऑब्जेक्ट्स एक प्रीफिक्स कैरेक्टर से शुरू होते हैं और एक लाइन टर्मिनेटर पर समाप्त होते हैं (ऐरे को छोड़कर, जिसमें अपना लाइन टर्मिनेटर शामिल नहीं होता)। RESP ऑब्जेक्ट का सबसे सरल उदाहरण OK सिंपल स्ट्रिंग रिस्पांस है:
+OK\r\n
(RESP एक मानव-पठनीय प्रोटोकॉल है लेकिन स्पष्टता के लिए मैं सभी RESP उदाहरणों में लाइन ब्रेक (\r\n) को स्पष्ट रूप से लिखूंगा।)
उपरोक्त सिंपल स्ट्रिंग में, + सिंपल स्ट्रिंग प्रीफिक्स है, OK सिंपल स्ट्रिंग का बॉडी है, और \r\n लाइन टर्मिनेटर है जो इस सिंपल स्ट्रिंग के अंत को चिह्नित करता है।
एक सिंपल स्ट्रिंग को पढ़ने के लिए, हम अगले \r\n लाइन टर्मिनेटर तक पढ़ते हैं, + तक के पूर्ववर्ती बाइट्स को लौटाए गए रिप्लाई स्ट्रिंग के रूप में लौटाते हैं। यह काम करता है क्योंकि RESP सिंपल स्ट्रिंग्स में कोई न्यूज़लाइन कैरेक्टर शामिल नहीं हो सकते।
एरर्स और इंटीजर्स को सिंपल स्ट्रिंग्स के समान फॉर्मेट किया जाता है, लेकिन वे अलग प्रीफिक्स का उपयोग करते हैं। एरर्स - से प्रीफिक्स्ड होते हैं:
-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) हैं। जबकि ऐरे लंबाई विनिर्देश हमें बल्क स्ट्रिंग पढ़ते समय जिस तरह से आगे बढ़ने की अनुमति देता है, वैसा करने की अनुमति नहीं देता, यह हमारे क्लाइंट में ऐरे को लागू करना आसान बनाता है। हम ऐरे साइज़ पढ़ते हैं, उतने ही अधिक ऑब्जेक्ट्स पढ़ते हैं, और फिर उन सभी ऑब्जेक्ट्स को अंतिम ऐरे में लौटाते हैं।
सभी Redis कमांड्स बल्क स्ट्रिंग्स के ऐरे के रूप में भेजे जाते हैं। उदाहरण के लिए, कमांड "SET mykey 'my value'" को लिखा और भेजा जाएगा:
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$8\r\nmy value\r\n
आगे RESP विवरण
RESP में उपयोग किए जाने वाले प्रीफिक्स्ड लेंथ पार्सर्स को जटिल स्टेट मॉडलिंग या डेटा के माध्यम से कई पास की आवश्यकता के बिना लागू करने की अनुमति देते हैं, जिससे बहुत तेज़ पार्सर्स बनाए जा सकते हैं।
कई विवरण हैं जो मैंने यहां कवर नहीं किए हैं, जैसे नल बल्क स्ट्रिंग्स और नल ऐरे। अधिक जानकारी के लिए, आधिकारिक डॉक्यूमेंटेशन (हमेशा की तरह) में RESP के लिए एक बहुत पठनीय और व्यापक डॉक्यूमेंटेशन पेज है।
प्रोटोकॉल को बेहतर ढंग से समझने का एक शानदार तरीका है एक साधारण क्लाइंट को स्वयं लागू करने का प्रयास करना। Go में Redis प्रोटोकॉल को पढ़ने और लिखने पर हमारे गाइड को आगे देखें।