RedisJSON और RediSearch हमारे क्लाउड में अब तक के सबसे लोकप्रिय Redis मॉड्यूल हैं। (चित्र 1 देखें) Redis के साथ बंडल किए गए RedisJSON और RediSearch के डॉकर इमेज हर दिन 2000 से अधिक बार खींचे जाते हैं। यही कारण है कि हम इटामर हाबेर, Redis में प्रौद्योगिकी इंजीलवादी, को एक दूरदर्शी मानते हैं जब उन्होंने 4 साल पहले पहला संस्करण लिखा था। अप्रैल में, हमने RedisConf में JSON, इंडेक्सिंग और पूर्ण-पाठ खोज क्षमताओं से संबंधित कई घोषणाएं कीं। आज, हम इन क्षमताओं के निजी पूर्वावलोकन की घोषणा करते हुए खुश हैं।
इस ब्लॉग में, हम आपको वर्तमान RedisJSON क्षमताओं का अवलोकन देंगे। उसके बाद हम इस निजी पूर्वावलोकन के नए क्षमताओं अनुभाग में गोता लगाएंगे। RediSearch का उपयोग करके JSON दस्तावेजों को इंडेक्स, क्वेरी और पूर्ण-पाठ खोज करने की क्षमता इस रिलीज की सबसे अच्छी नई सुविधा है। अंत में, हम आपको दिखाएंगे कि जल्दी से कैसे शुरू करें।
JSON क्षमताएं
जब आपके पास RedisJSON नहीं होता है, तो आप Redis में String डेटा संरचना का उपयोग करके नेस्टेड दस्तावेजों को मॉडल करते हैं।
लेकिन, क्या होगा अगर हमें दस्तावेज़ के एक उपभाग को अपडेट करने की आवश्यकता है?
ऑपरेशन की परमाणुता को बनाए रखने के लिए, हमें आवश्यकता होगी:
- दस्तावेज़ के लिए WATCH
- पिछले संस्करण को पढ़ें और डिसीरियलाइज़ करें
- अपडेट को Redis ट्रांजैक्शन में एम्बेड करें
- JSON में सीरियलाइज़ करें और दस्तावेज़ को अपडेट करें
- ट्रांजैक्शन निष्पादित करें
यदि इस प्रक्रिया के दौरान किसी अन्य क्लाइंट ने दस्तावेज़ को अपडेट किया तो हमें इन सभी चरणों को पुनः प्रयास करने की आवश्यकता हो सकती है।
हालांकि, RedisJSON के साथ, हम इस अपडेट को एकल परमाणु ट्रांजैक्शन के साथ कर सकते हैं:
आइए एक और उदाहरण देखें, जहां आपके पास एक बड़ा JSON है, लेकिन आपके एप्लिकेशन में उस दस्तावेज़ के केवल एक उपभाग की आवश्यकता है।
RedisJSON के बिना:
आपको करना होगा:
- पूरा JSON स्ट्रिंग प्राप्त करें, एक स्ट्रिंग के रूप में सीरियलाइज़ किया गया
- JSON को डिसीरियलाइज़ करें
- आपको जिस उपभाग की आवश्यकता है उसे निकालें
RedisJSON के साथ, आप एकल कमांड के साथ केवल आवश्यक डेटा प्राप्त कर सकते हैं, CPU चक्र, नेटवर्क ओवरहेड, और सबसे महत्वपूर्ण, लेटेंसी को कम कर सकते हैं।
जैसा कि आप देख सकते हैं, RedisJSON JSON दस्तावेज़ मैनिपुलेशन को सरल बनाता है। RedisJSON का वर्तमान GA संस्करण (v1.0) वह संस्करण है जिसे समुदाय पहले से ही व्यापक रूप से उपयोग कर रहा है और String डेटा संरचना के साथ नेस्टेड संरचनाओं को मॉडल करने की कमियों को ठीक करता है। इसकी कुछ प्रमुख क्षमताओं का अवलोकन यहां दिया गया है।
Redis में एक कुंजी से जुड़े एक JSON दस्तावेज़ को संग्रहीत (या अपडेट) करें
एक उपभाग को बदलें (उदाहरण के लिए एक कुंजी का स्ट्रिंग मान)
एक संग्रह या मैप में एक आइटम जोड़ें
पूरे दस्तावेज़ को निकालें
JSONPath के एक सबसेट का उपयोग करके इसका एक हिस्सा निकालें
RedisJSON 2.0: निजी पूर्वावलोकन रिलीज
हमने इस संस्करण की घोषणा RedisConf 2021 में की थी, और आज हम यह घोषणा करते हुए खुश हैं कि यह हमारे Redis Enterprise ग्राहकों के एक चुनिंदा समूह के लिए निजी पूर्वावलोकन के रूप में उपलब्ध है—और हमारे समुदाय के लिए रिलीज कैंडिडेट के रूप में। इस संस्करण में तीन प्रमुख विशेषताएं हैं, अर्थात्, JSONPath अभिव्यक्ति का पूर्ण समर्थन, Redis Enterprise के साथ Active-Active के लिए समर्थन, और RediSearch के साथ JSON दस्तावेजों को इंडेक्स, क्वेरी और पूर्ण-पाठ खोज करने की क्षमता। लेकिन इससे भी अधिक है! आइए नई सुविधाओं में गोता लगाएं।
Rust में पुनर्लिखित
सिस्टम प्रोग्रामिंग भाषाएं दक्षता के लिए उन्मुख भाषाओं का एक परिवार हैं। इन भाषाओं में लिखे गए प्रोग्राम आमतौर पर हल्के होते हैं और सर्वोत्तम प्रदर्शन प्रदान करते हैं। यही कारण है कि Redis को ऐतिहासिक रूप से C में लिखा गया है। यह भी बताता है कि Redis अत्यंत कम लेटेंसी और उच्च थ्रूपुट प्राप्त करने में सक्षम क्यों है। अधिकांश Redis मॉड्यूल C, C++, या Rust में लिखे गए हैं, जो उसी परिवार की भाषाएं हैं।
JSON विशेष रूप से Rust समुदाय द्वारा बहुत अच्छी तरह से परोसा जाता है जिसमें बहुत तेज और कुशल JSON सीरियलाइज़ेशन और JSONPath कार्यान्वयन शामिल हैं। उन कार्यान्वयनों का लाभ Redis उपयोगकर्ताओं को देना स्पष्ट था और केवल Redis मॉड्यूल API और Rust के बीच मैपिंग की आवश्यकता थी।
JSONPath के लिए पूर्ण समर्थन
और यहां इस Rust पुनर्लेखन का लाभ है। इस नए संस्करण में JSONPath के लिए व्यापक समर्थन शामिल है। अब JSONPath अभिव्यक्तियों की पूरी अभिव्यंजना का उपयोग करना संभव है।
एक JSON दस्तावेज़ दिया गया
वाइल्डकार्ड (पहले पहले आइटम तक सीमित)
स्लाइस निकालें
फिल्टर अभिव्यक्तियों के साथ एक अधिक उन्नत उदाहरण
Active-Active के लिए समर्थन
Active-Active Redis Enterprise द्वारा प्रदान की जाने वाली एक सुविधा है। Active-Active आपको अपने डेटाबेस को कई भौगोलिक रूप से वितरित Redis Enterprise क्लस्टर में दोहराने की अनुमति देता है। उपयोगकर्ता स्थानीय पढ़ने और लिखने की लेटेंसी के साथ निकटतम क्लस्टर से जुड़ सकते हैं।
कार्यान्वयन संघर्ष-मुक्त प्रतिकृति डेटा-प्रकार (CRDT) तकनीक पर आधारित है। जबकि Redis द्वारा समर्थित अधिकांश कोर डेटा संरचनाओं के लिए इसे लागू करते हुए, Redis ने इस नए कार्यान्वयन द्वारा पुष्टि किए गए मजबूत ज्ञान और अनुभव विकसित किया है जो JSON के लिए बनाया गया है।
एप्लिकेशन डेवलपर अब JSON दस्तावेजों का उपयोग करके जियो-वितरित एप्लिकेशन बनाने के लिए इस पर भरोसा कर सकते हैं। दो क्लस्टर के साथ एक सक्रिय-सक्रिय वातावरण में संचालन के उत्तराधिकार का एक उदाहरण यहां दिया गया है:
आइए प्रत्येक संचालन का विवरण देखें:
- T1: एक क्लाइंट क्लस्टर 1 पर एक JSON दस्तावेज़ सेट करता है।
- T2: सिंक्रनाइज़ेशन प्रक्रिया दस्तावेज़ को क्लस्टर 2 पर दोहराती है।
- T3: दोनों क्लस्टर में समान दस्तावेज़ होता है।
- T4: एक क्लाइंट क्लस्टर 1 में रंग सरणी में नीला रंग जोड़ता है, और समवर्ती रूप से, एक अन्य क्लाइंट क्लस्टर 2 में उसी सरणी में हरा रंग जोड़ रहा है।
- T5: सिंक्रनाइज़ेशन प्रक्रिया ऑपरेशन को मर्ज करती है और दोनों क्लस्टर पर दस्तावेज़ को अपडेट करती है।
- T6: दोनों क्लस्टर में समान दस्तावेज़ होता है।
जब यह क्षमता पब्लिक पूर्वावलोकन में होगी तो हम सभी सिंक्रनाइज़ेशन प्रवाह पर विस्तार से चर्चा करेंगे, लेकिन यदि आप इस क्षमता में रुचि रखते हैं, तो अभी support@redis.com पर संपर्क करने में संकोच न करें।
RediSearch 2.2: निजी पूर्वावलोकन रिलीज
यह ब्लॉग RediSearch 2.2 के लिए निजी पूर्वावलोकन की उपलब्धता की भी घोषणा करता है (हमारे Redis Enterprise ग्राहकों के एक चुनिंदा समूह के लिए निजी पूर्वावलोकन के रूप में और हमारे समुदाय के लिए रिलीज कैंडिडेट के रूप में)।
इस खंड में हम RediSearch के इस नए रिलीज द्वारा प्रदान की गई नई सुविधाओं का वर्णन करने जा रहे हैं। लेकिन पहले, यहां एक कारण है कि हम उन दो लोकप्रिय मॉड्यूल को एक साथ जारी कर रहे हैं:
JSON दस्तावेजों की इंडेक्सिंग, क्वेरीिंग, और पूर्ण-पाठ खोज
यह विशेष नई सुविधा Redis की JSON क्षमताओं को एक नए स्तर पर ले जाएगी। केवल एक Key-Value स्टोर होने से परे, अब तक, RediSearch हैश पर इंडेक्सिंग और खोज क्षमताएं प्रदान कर रहा था। हुड के तहत, RedisJSON 2.0 एक आंतरिक सार्वजनिक API उजागर करता है। आंतरिक, क्योंकि यह API एक Redis नोड के अंदर चल रहे अन्य मॉड्यूल के लिए उजागर किया गया है। सार्वजनिक, क्योंकि कोई भी मॉड्यूल इस API का उपभोग कर सकता है। RediSearch 2.2 भी करता है!
अन्य मॉड्यूल के लिए अपनी क्षमताओं को उजागर करके, RedisJSON RediSearch को JSON दस्तावेजों को इंडेक्स करने की क्षमता देता है ताकि उपयोगकर्ता अब सामग्री को इंडेक्स और क्वेरी करके दस्तावेजों को ढूंढ सकें। ये संयुक्त मॉड्यूल आपको एक शक्तिशाली, कम लेटेंसी, JSON-उन्मुख दस्तावेज़ डेटाबेस देते हैं!
आइए देखें कि यह कैसा दिखेगा।
हमें पहले JSON.SET कमांड का उपयोग करके डेटाबेस को एक JSON दस्तावेज़ के साथ भरना चाहिए।
एक नया इंडेक्स बनाने के लिए, हम FT.CREATE कमांड का उपयोग करते हैं। इंडेक्स का स्कीमा अब JSONPath अभिव्यक्तियों को स्वीकार करता है। अभिव्यक्ति का परिणाम इंडेक्स किया जाता है और एक विशेषता (यहां: शीर्षक) से जुड़ा होता है।
अब हम एक खोज क्वेरी कर सकते हैं और FT.SEARCH का उपयोग करके अपना JSON दस्तावेज़ ढूंढ सकते हैं:
JSON दस्तावेजों पर एग्रीगेशन
एग्रीगेशन RediSearch की एक शक्तिशाली सुविधा है जिसका उपयोग विश्लेषणात्मक रिपोर्ट बनाने या फेसेटेड खोज शैली क्वेरी करने के लिए किया जा सकता है। अब जब RediSearch JSON दस्तावेजों तक पहुंच सकता है, तो JSONPath अभिव्यक्ति का उपयोग करके JSON दस्तावेज़ से किसी भी मूल्य को लोड करना और इसे पाइपलाइन में उपयोग करना संभव है चाहे वह मूल्य इंडेक्स किया गया हो या नहीं।
आइए एक इंडेक्स बनाएं:
डेटाबेस में एक JSON दस्तावेज़ जोड़ें:
और JSON दस्तावेज़ से निकाले गए दो संख्यात्मक मानों का उपयोग करके एक साधारण गणना करें:
इंडेक्सिंग रणनीति पर अधिक लचीलापन
RediSearch के नए संस्करण के साथ, अब उसी मान (हैश पर फ़ील्ड, या JSON दस्तावेज़ से JSON मान) को विभिन्न पैरामीटर के साथ इंडेक्स करना संभव है। यहां एक सामान्य उपयोग का मामला है, जिसे इस नई सुविधा द्वारा हल किया गया है:
आइए एक डेटाबेस लें जिसमें दस्तावेज़ हों जो श्रेणियों से संबंधित हों।
TAG प्रकार का उपयोग करके आप अपने खोज परिणामों को किसी भी श्रेणी पर आसानी से फ़िल्टर कर सकते हैं:
लेकिन क्या होगा यदि आप श्रेणियों पर पूर्ण-पाठ खोज भी करना चाहते हैं?
अब तक, हैश के साथ, आपको मान को दो फ़ील्ड में डुप्लिकेट करना पड़ता था, जो दोगुनी मेमोरी की खपत करता था।
यहीं पर FT.CREATE…AS बहुत काम का बन गया है। आइए अपने अच्छे और सरल दस्तावेज़ पर वापस आएं:
…और नई AS सुविधा का उपयोग करें:
…और…
बिंगो! अब हम एक टैग द्वारा फ़िल्टर कर सकते हैं, और उसी फ़ील्ड में पूर्ण-पाठ खोज कर सकते हैं, डेटा को डुप्लिकेट किए बिना।
क्वेरी प्रोफाइलिंग
अधिकांश Redis कमांड की समय जटिलता अच्छी तरह से प्रलेखित है। उदाहरण के लिए, HMGET O(N) की जटिलता के साथ आता है, "जहां N अनुरोधित फ़ील्ड की संख्या है।" RediSearch के साथ, उन्नत क्वेरी लिखना संभव है। हालांकि, FT.SEARCH और FT.AGGREGATE कमांड की जटिलता क्वेरी की जटिलता पर निर्भर करती है।
हम आपको यह समझने के लिए उपकरण देना चाहते थे कि जब एक क्वेरी निष्पादित होती है तो हुड के तहत क्या हो रहा है, यह पता लगाने के लिए कि समय कहां खर्च होता है, और क्वेरी को कैसे अनुकूलित किया जा सकता है। नया FT.PROFILE कमांड एक ट्री लौटाता है जो RediSearch द्वारा क्वेरी को निष्पादित करने के लिए उपयोग किए जाने वाले मुख्य चरणों को दिखाता है। प्रत्येक चरण के लिए, समय की जानकारी दी जाती है।
तो जब हम फजी खोज के साथ एक क्वेरी कर रहे होते हैं तो RediSearch के अंदर क्या होता है?
एक उदाहरण देखते हैं:
हम अपनी क्वेरी को प्रोफाइल करने के लिए तैयार हैं। आइए प्रोफाइलिंग चलाएं और प्रोफाइलिंग परिणाम को विघटित करें।
redis.cloud:6379> FT.PROFILE idx SEARCH LIMITED QUERY "%hello%"
पहले हमें परिणाम मिलता है। यह जांचने के लिए उपयोगी है कि प्रोफाइलिंग क्वेरी वह लौटाती है जो अपेक्षित है।
यहां कुल समय है, जिसे "प्रोफाइल समय" कहा जाता है, क्योंकि इसमें प्रोफाइल जानकारी एकत्र करने में खर्च किया गया समय शामिल है।
क्वेरी को पार्स करने और निष्पादन योजना बनाने में खर्च किया गया समय:
शब्दकोश में फजी मैच खोजने में खर्च किया गया समय:
और अंत में, क्या आपने कभी सोचा है कि खोज परिणाम बनाने का क्या मतलब है? हमें प्रत्येक दस्तावेज़ के लिए पूर्ण-पाठ स्कोर की गणना करने, उन्हें स्कोर के आधार पर सॉर्ट करने, और अंत में फ़ील्ड लोड करने की आवश्यकता है। इस जानकारी के साथ आप बॉटलनेक की पहचान कर सकते हैं, क्वेरी को तेज़ बना सकते हैं, और सर्वर के प्रदर्शन में सुधार कर सकते हैं।
शुरू कैसे करें
हम मानते हैं कि ये नई क्षमताएं एप्लिकेशन डेवलपर्स और Redis समुदाय के लिए गेम चेंजर हैं। यहां बताया गया है कि आप कैसे शुरू करते हैं।
पूर्वावलोकन के डॉकर इमेज का उपयोग करें
शुरू करने के लिए आप :preview टैग के साथ निम्नलिखित डॉकर इमेज खींच सकते हैं:
docker run -p 6379:6379 redis/redismod:preview
वैकल्पिक रूप से, आप दोनों रिपॉजिटरी पर RC1 रिलीज टैग (RediSearch के लिए v2.2.0, RedisJSON के लिए v2.0.0) से संकलित कर सकते हैं और उन्हें Redis में लोड कर सकते हैं।
एक बार जब आप चालू हो जाते हैं, तो आप उपरोक्त सभी कमांड को आज़मा सकते हैं या इस क्विकस्टार्ट गाइड के साथ। हम RedisMart के बारे में ब्लॉग की एक श्रृंखला भी लॉन्च करेंगे, एक ऑनलाइन रिटेल एप्लिकेशन जिसे हमने RedisConf 2021 के मुख्य नोट के दौरान प्रदर्शित किया था। RedisMart जियो-वितरित तरीके से तैनात RediSearch और RedisJSON का लाभ उठाकर सर्वोत्तम ऑनलाइन रिटेल अनुभव प्रदान करता है। इस श्रृंखला में, हम आपको चरण-दर-चरण बताएंगे कि हमने इस एप्लिकेशन को कैसे बनाया।
संगत क्लाइंट के नवीनतम संस्करणों का उपयोग करके विकसित करें
क्लाइंट की निम्नलिखित सूची वर्तमान में अपग्रेड की जा रही है ताकि आप एक अच्छे डेवलपर अनुभव के साथ नई सुविधाओं का उपयोग कर सकें। नवीनतम रिलीज और/या पुल अनुरोध देखें (इस समय उनमें से अधिकांश मास्टर शाखाओं पर पूर्वावलोकन संस्करण का समर्थन कर रहे हैं)।
| RedisJSON | RediSearch | |
| Node.js | redis-modules-sdk | redis-modules-sdk |
| Java | JredisJSON | JRediSearch |
| .NET | NRedisJSON | NRediSearch |
| Python | redisjson-py | redisearch-py |
समुदाय में शामिल हों
हम सामान्य उपलब्धता की दिशा में काम करते हुए किसी भी प्रतिक्रिया, बग रिपोर्ट, सुविधा अनुरोध का स्वागत करते हैं। RediSearch (GitHub पर) या RedisJSON (GitHub पर) के github रिपॉजिटरी में दस्तावेज़ वेबसाइटों पर प्रतिक्रिया दें, या Discord पर हमसे संपर्क करें।