Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

रेडिस डेटा स्ट्रक्चर का परिचय:सॉर्ट किए गए सेट

सॉर्ट किया गया सेट रेडिस में सबसे उन्नत डेटा संरचनाओं में से कुछ है। क्रमबद्ध सेट अनिवार्य रूप से ऑर्डर किए गए रेडिस स्ट्रिंग्स का एक अनूठा संग्रह है जिसमें उनके साथ एक संख्यात्मक स्कोर जुड़ा होता है। ऑर्डरिंग स्कोर और स्ट्रिंग लेक्सिकोग्राफ़िकल ऑर्डर (इस पर बाद में और अधिक) पर आधारित है। स्ट्रिंग्स अद्वितीय होनी चाहिए जबकि स्कोर दोहराया जा सकता है।

सूचियों के अलावा, यह केवल आदेशित है रेडिस में डेटा संरचना और सूची के लिए प्राथमिकता दी जाती है जब सूची के किसी भी हिस्से तक पहुंच महत्वपूर्ण होती है (सूची के विपरीत जो सूची के सिरों तक पहुंच प्रदान करती है)। सॉर्ट किए गए सेट में औसत केस प्रविष्टि, निष्कासन और खोज O(N) है, जहां N सेट में तत्वों की संख्या है।

क्रमबद्ध करना

सॉर्ट किए गए सेट में स्कोर -(2^) और +(2^) शामिल रेंज में डबल 64-बिट फ्लोटिंग पॉइंट नंबर होते हैं। क्रमबद्ध सेटों को उनके स्कोर के अनुसार आरोही क्रम में क्रमबद्ध किया जाता है। मौजूदा कुंजियों के लिए स्कोर अपडेट किए जा सकते हैं। स्कोर संबंधों को तोड़ने के लिए, सॉर्ट किए गए सेट में स्ट्रिंग्स को लेक्सिकोग्राफ़िक रूप से आरोही क्रम में क्रमबद्ध किया जाता है। रेडिस 2.8 में, इस लेक्सिकोग्राफिक ऑर्डरिंग का फायदा उठाने के लिए एक नई सुविधा लागू की गई थी:लेक्सिकोग्राफिक रेंज क्वेरीिंग। इसमें आकर्षक उपयोग के मामले हैं जिन्हें हम बाद में देखेंगे।

कमांड

Redis सॉर्ट किए गए सेट सरल सेट, गेट, मेंबर काउंट से लेकर जटिल लेक्सिकोग्राफ़िक रेंज गणनाओं तक विभिन्न प्रकार के संचालन का समर्थन करते हैं। लगभग 25+ संचालन समर्थित हैं। हम उनमें से एक सबसेट को देखेंगे। आइए बुनियादी बातों से शुरू करें:

# ZADD key [NX|XX] [CH] [INCR] स्कोर मेंबर [स्कोर मेंबर ...] सेट में एलिमेंट जोड़ें# O(log(N) जहां N सेट में एलिमेंट्स की संख्या है# [ NX|XX], [CH] और [INCR] पर उपलब्ध> 3.0.2127.0.0.1:6379> zadd Scoreboard 999 "anorak"(integer) 1# अनुरूप:सदस्यों को हटाने के लिए ZREM कुंजी सदस्य [सदस्य ...] का उपयोग करें एक सॉर्ट किया गया सेट।# ZCARD कुंजी O(1):सेट की कार्डिनैलिटी127.0.0.1:6379> zcard Scoreboard(integer) 1# इन्सर्ट मल्टी127.0.0.1:6379> zadd Scoreboard 99 "daito" 99 "shoto" 199 "aech" 299 "art3mis" 399 "parzival"(पूर्णांक) 5# ZSCORE कुंजी सदस्य। O(1) key.127.0.0.1:6379> zscore Scoreboard parzival"399"# ZRANK पर सॉर्ट किए गए सेट में सदस्य का स्कोर लौटाता है प्रमुख सदस्य ओ (लॉग (एन)) सदस्य की रैंक प्राप्त करें। )) सदस्य की रैंक प्राप्त करें, जिसके स्कोर उच्च से निम्न तक हैं127.0.0.1:6379> zrevrank Scoreboard anorak(integer) 0127.0.0.1:6379> zrevrank Scoreboard Shoto(int eger) 4# ZINCRBY की इंक्रीमेंट मेंबर O(log(N)) इंक्रीमेंट के हिसाब से की पर स्टोर किए गए सॉर्ट किए गए सेट में सदस्य के स्कोर को बढ़ाता है। 

उपरोक्त कुछ बुनियादी संचालन थे जो एक क्रमबद्ध सेट पर संभव थे। सॉर्ट किए गए सेट का वास्तविक मूल्य सेट के भीतर प्रश्नों के आधार पर इसकी सीमा में चमकता है। आइए उन पर एक नजर डालते हैं।

# ZRANGE की स्टार्ट स्टॉप [WITHSCORES]। O(log(N)+M) N के साथ सॉर्ट किए गए सेट में तत्वों की संख्या है और M लौटाए गए तत्वों की संख्या है। # स्टार्ट और स्टॉप समावेशी शून्य आधारित इंडेक्स हैं। 127.0.0.1:6379> zrange स्कोरबोर्ड 0 -1 WITHSCORES 1) "डेटो" 2) "99" 3) "शोटो" 4) "99" 5) "एच" 6) "199" 7) "आर्ट3मिस" 8) "299" 9) "पैराज़िवल"10) "499" 11) "एनोरक"# 0:पहला सदस्य। -1:अंतिम सदस्य# अनुरूप:ZREVRANGE कुंजी स्टार्ट स्टॉप [WITHSCORES]127.0.0.1:6379> zrevrange Scoreboard 0 -1 WITHSCORES 1) "anorak" 2) "999" 3) "parzival" 4) "499" 5) " art3mis" 6) "299" 7) "aech" 8) "199" 9) "shoto"10) "99"11) "daito"12) "99"# ZRANGEBYSCORE key min max [WITHSCORES] [लिमिट ऑफ़सेट काउंट] . ओ (लॉग (एन) + एम) न्यूनतम और अधिकतम (समावेशी) के बीच स्कोर के साथ कुंजी पर क्रमबद्ध सेट में सभी तत्वों को लौटाता है # अनुरूप:ZREVRANGEBYSCORE कुंजी अधिकतम न्यूनतम [WITHSCORES] [सीमा ऑफसेट गिनती] # 499 <=स्कोर <=+inf 127.0.0.1:6379> zrangebyscore Scoreboard 499 +inf1) "parzival"2) "anorak"# 499  zrangebyscore Scoreboard (499 +inf1) "anorak"# ZCOUNT key न्यूनतम अधिकतम O(log(N)) न्यूनतम और अधिकतम 127.0.0.1:6379> zcount स्कोरबोर्ड -inf 499 (पूर्णांक) 5127.0.0.1:6379> zcount स्कोरबोर्ड के बीच स्कोर के साथ कुंजी पर क्रमबद्ध सेट में तत्वों की संख्या देता है -inf +inf(पूर्णांक) 6

इसी तरह की अन्य समान श्रेणी संबंधित कमांड ZREMRANGEBYRANK, ZREMRANGEBYSCORE आदि हैं।

सेट क्वेरी कमांड का एक और सेट है जो Redis 2.8 में पेश किया गया था:लेक्सिकोग्राफिक रेंज (*BYLEX) कमांड। इन आदेशों के लिए अंतराल कैसे निर्दिष्ट किए जाते हैं, इसका विवरण यहां प्रलेखित है। इन आदेशों के सही ढंग से काम करने की आवश्यकता यह है कि क्रमबद्ध सेट के सदस्यों का एक समान स्कोर होना चाहिए। शब्दावली श्रेणियों के साथ काम करने के लिए मुख्य आदेश ZRANGEBYLEX, ZREVRANGEBYLEX, ZREMRANGEBYLEX और ZLEXCOUNT हैं। आइए कुछ उदाहरण देखें:

127.0.0.1:6379> zadd lexscores 0 dd 0 aa 0 ccc 0 aaa 0 bb 0 d (पूर्णांक) 6# एक बार डालने के बाद, मुफ्त में लेक्सिकोग्राफिक सॉर्टिंग! 127.0.0.1:6379> zrange lexscores 0 -11) "आ "2) "आआ" 3) "बीबी" 4) "सीसीसी" 5) "डी" 6) "डीडी" # ZRANGEBYLEX कुंजी न्यूनतम अधिकतम [सीमा ऑफसेट गिनती]। ओ (लॉग (एन) + एम)। न्यूनतम अधिकतम निर्दिष्ट सीमा। LIMIT SQL में सीमा की तरह है। c127.0.0.1:6379> ZRANGEBYLEX lexscores (a [c1) "aa"2) "aaa"3) "bb"# मिनट शामिल करें:अधिकतम को बाहर करें:ccc127.0.0.1:6379> ZRANGEBYLEX lexscores (a [ ccc1) "aa"2) "aaa"3) "bb"4) "ccc"# min:aa max को बाहर करें:cccc127.0.0.1:6379> ZRANGEBYLEX lexscores (aa [ccc1) "aaa"2) "bb शामिल करें। "3) "ccc"# मिनट:aa मैक्स को बाहर करें:सभी127.0.0.1:6379> ZRANGEBYLEX lexscores (aa +1) "aaa"2) "bb"3) "ccc"4) "d"5) " डीडी"

फिर भी सॉर्ट किए गए सेट के लिए कमांड का एक और सेट यूनियन और इंटरसेक्शन ऑपरेशन हैं।

आंतरिक

सॉर्ट किए गए सेट दोहरे डेटा संरचना के रूप में कार्यान्वित किए जाते हैं:यह हैश और स्किप सूची दोनों का एक संयोजन है। हैश पार्ट ऑब्जेक्ट को स्कोर के लिए मैप करता है और स्किप लिस्ट स्कोर को ऑब्जेक्ट पर मैप करता है। हम पहले से ही जानते हैं कि रेडिस में हैश को हमारी पिछली पोस्ट से कैसे लागू किया जाता है। छोड़ें सूची सुनिश्चित करती है कि खोजें तेज़ हैं और औसतन अधिकांश ऑपरेशन O(log N) हैं। छोड़ें सूची फ़ाइल t_zset.c.

. में लागू की गई है

अधिकांश अन्य Redis डेटा संरचनाओं की तरह, सॉर्ट किए गए सेट भी आकार के लिए अनुकूलित होते हैं जब वे छोटे होते हैं। सॉर्ट किए गए सेट केवल हैश के रूप में संग्रहीत किए जाते हैं जब तक कि वे एक निश्चित आकार तक नहीं बढ़ जाते। इस आकार को नियंत्रित करने वाले कॉन्फ़िगरेशन पैरामीटर हैं: zset-max-ziplist-entries (डिफ़ॉल्ट 128) और zset-max-ziplist-value (डिफ़ॉल्ट 64)।
आकार अनुमान:https://stackoverflow.com/questions/6076342/is-there-a-practical-limit-to-the-number-of-elements-in-a-sorted- सेट-इन-रेडिस

अनुप्रयोग

उन्नत डेटा संरचना होने के कारण, सॉर्ट किए गए सेट में विभिन्न उपयोग के मामले होते हैं:

  1. इसका सबसे स्पष्ट उपयोग मामला स्कोरबोर्ड के रूप में है:अद्वितीय सदस्यों की क्रमबद्ध सूची को उनके स्कोर के अनुसार बनाए रखना। उदाहरण के लिए MMORPG के लिए एक लीडर स्कोरबोर्ड जैसा कि आधिकारिक Redis दस्तावेज़ीकरण में बताया गया है।
  2. समान स्कोर वाले सॉर्ट किए गए सेट को रेडिस में इंडेक्स के रूप में उपयोग किया जाता है। यह बहुत ही सरल उपयोग के मामले से लेकर वास्तव में जटिल लोगों तक हो सकता है। Redis दस्तावेज़ में सॉर्ट किए गए सेट का उपयोग करके अनुक्रमण पर एक अद्भुत लेख है।
  3. सॉर्ट किए गए सेट का उपयोग करके अनुक्रमण का एक विशेष मामला Redis के लिए GEO API है जिसे Redis 3.2.0 में पेश किया गया था।
  4. सॉर्ट किए गए सेट का उपयोग करते समय आकार एक विचार है। जटिल बैकिंग डेटा संरचनाओं को देखते हुए सॉर्ट किए गए सेट में अपेक्षाकृत बड़ा मेमोरी फ़ुटप्रिंट होगा। सटीक संख्या डेटा सेट की प्रकृति पर निर्भर करेगी। इस स्टैक ओवरफ्लो पोस्ट में उचित आकार के डेटा सेट के लिए बॉलपार्क संख्या का उल्लेख है।

चूंकि सॉर्ट किए गए सेट में काफी उन्नत उपयोग के मामले हैं, हम बाद के पोस्ट में सॉर्ट किए गए सेट के लिए ऐसे उपयोग मामलों पर चर्चा करेंगे। अभी के लिए, एक आसान सा उदाहरण देखते हैं।

अपने MOOC को गेमिफाई करें!

Redis बिटमैप्स पर हमारी पिछली पोस्ट में, हम एक बहुत ही लोकप्रिय MOOC का समर्थन करने वाले डेवलपर थे। फैसिलिटेटर तय करते हैं कि वे एक लीडर बोर्ड के साथ पाठ्यक्रम को सरल बनाना चाहते हैं जो सामुदायिक पदों में योगदान देने वाले शीर्ष छात्रों पर नज़र रखता है। पाठ्यक्रम समुदाय पोस्ट पर पोस्ट की गई समस्याओं के स्वीकृत उत्तरों की शीर्ष संख्या वाले छात्रों को हर सप्ताह एक विशेष उल्लेख प्राप्त होगा।
यह अद्वितीय कुंजी उर्फ ​​रेडिस सॉर्ट किए गए सेट के स्कोर आधारित ऑर्डरिंग के लिए क्लासिक उपयोग का मामला होगा। छात्र आईडी सदस्य होंगे जबकि स्कोर स्वीकृत उत्तरों की संख्या होगी। हम ZINCRBY . का उपयोग करके स्कोर को अपडेट कर सकते हैं वास्तविक समय में या पृष्ठभूमि की नौकरी में जो दैनिक या साप्ताहिक चल सकती है। स्पष्ट रूप से हमारे उपयोग के मामले में वास्तविक समय में स्कोर अपडेट करना आवश्यक है। प्रारंभिक प्रविष्टि के लिए ZADD नए झंडों में से एक काम आएगा। छात्रों को स्कोरबोर्ड प्रदर्शित करने के लिए रिवर्स रेंज क्वेरीज़ (ZREVRANGE) का उपयोग करना होगा। आदि)

फुटनोट

हमारी रेडिस डेटा संरचना श्रृंखला में अन्य पोस्ट:

  • सेट
  • हैश
  • बिटमैप

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis कैश से डेटा पुनर्प्राप्त नहीं करेगा

  2. स्प्रिंग-डेटा-रेडिस के साथ रेडिस में इकाई अपडेट करें

  3. लिखने के पैमाने के रूप में लगातार हैशिंग

  4. रेडिस और मेमकेचे या सिर्फ रेडिस?

  5. रेस्क्यू-शेड्यूलर नौकरी निकालने में विफल रहता है