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

Redis वायर प्रोटोकॉल का खुलासा: RESP के लिए शुरुआती गाइड

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 प्रोटोकॉल को पढ़ने और लिखने पर हमारे गाइड को आगे देखें।


  1. रेडिस इनसाइडर एंबेसडर प्रोग्राम पेश करना रेडिस इनसाइडर एंबेसडर प्रोग्राम पेश करना

    हम अपना पहला एंबेसडर प्रोग्राम लॉन्च करने के लिए उत्साहित हैं: रेडिस इनसाइडर्स। रेडिस ओपन सोर्स है और दुनिया भर में इसके लाखों उपयोगकर्ता हैं। यह हमारे डेवलपर समुदाय को हमारे उत्पादों के केंद्र में रखता है। हम अपने सबसे समर्पित और भावुक समुदाय के सदस्यों के साथ मिलकर काम करने के लिए उत्सुक हैं ताकि

  1. Redis SETRANGE में महारत हासिल करें: स्ट्रिंग मान के भाग को कुशलतापूर्वक अपडेट करें Redis SETRANGE में महारत हासिल करें: स्ट्रिंग मान के भाग को कुशलतापूर्वक अपडेट करें

    इस ट्यूटोरियल में, हम सीखेंगे कि Redis डेटास्टोर में किसी निर्दिष्ट कुंजी पर संग्रहीत स्ट्रिंग मान के किसी भाग को कैसे अपडेट करें। इसके लिए हम Redis SETRANGE कमांड का उपयोग करेंगे। SETRANGE कमांड यह कमांड प्रारंभ (सम्मिलित) ऑफसेट लेता है, जो स्ट्रिंग मान के अपडेट किए जाने वाले भाग के प्रारंभ इंडेक्

  1. Redis STRLEN का उपयोग करके स्ट्रिंग लंबाई तुरंत प्राप्त करें Redis STRLEN का उपयोग करके स्ट्रिंग लंबाई तुरंत प्राप्त करें

    इस ट्यूटोरियल में, हम सीखेंगे कि किसी कुंजी पर संग्रहीत स्ट्रिंग मान की लंबाई कैसे प्राप्त करें। इसके लिए हम Redis STRLEN कमांड का उपयोग करेंगे। STRLEN कमांड यह कमांड किसी कुंजी पर संग्रहीत स्ट्रिंग मान की लंबाई (वर्णों की संख्या) वापस करता है। यदि कुंजी Redis डेटास्टोर में मौजूद नहीं है, तो इसे खा