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

रेडिस के लिए उपयोग की जाने वाली अंतर्निहित डेटा संरचनाएं क्या हैं?

मैं आपके प्रश्न का उत्तर देने का प्रयास करूंगा, लेकिन मैं कुछ ऐसी चीज से शुरू करूंगा जो पहली बार में अजीब लग सकती है:यदि आप रेडिस इंटर्नल में रुचि नहीं रखते हैं तो आपको परवाह नहीं करना चाहिए डेटा प्रकारों को आंतरिक रूप से कैसे कार्यान्वित किया जाता है, इसके बारे में। यह एक साधारण कारण के लिए है:प्रत्येक रेडिस ऑपरेशन के लिए आपको दस्तावेज़ीकरण में समय जटिलता मिलेगी और, यदि आपके पास संचालन और समय जटिलता का सेट है, तो आपको केवल एक और चीज की आवश्यकता है स्मृति उपयोग के बारे में कुछ सुराग (और क्योंकि हम कई अनुकूलन करते हैं जो डेटा के आधार पर भिन्न हो सकते हैं, इन बाद के आंकड़ों को प्राप्त करने का सबसे अच्छा तरीका कुछ तुच्छ वास्तविक विश्व परीक्षण करना है)।

लेकिन चूंकि आपने पूछा है, यहां प्रत्येक रेडिस डेटा प्रकार का अंतर्निहित कार्यान्वयन है।

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

लेकिन जब सूचियां, सेट और सॉर्ट किए गए सेट आइटमों की संख्या और सबसे बड़े मानों के आकार में छोटे होते हैं, तो एक अलग, अधिक कॉम्पैक्ट एन्कोडिंग का उपयोग किया जाता है। यह एन्कोडिंग विभिन्न प्रकारों के लिए अलग है, लेकिन इसमें यह विशेषता है कि यह डेटा का एक कॉम्पैक्ट ब्लॉब है जो अक्सर प्रत्येक ऑपरेशन के लिए ओ (एन) स्कैन को मजबूर करता है। चूंकि हम इस प्रारूप का उपयोग केवल छोटी वस्तुओं के लिए करते हैं, यह कोई समस्या नहीं है; एक छोटे O(N) ब्लॉब को स्कैन करना कैश अनजान . है इसलिए व्यावहारिक रूप से बोलना बहुत तेज़ है, और जब बहुत अधिक तत्व होते हैं तो एन्कोडिंग स्वचालित रूप से मूल एन्कोडिंग (लिंक की गई सूची, हैश, और आगे) पर स्विच हो जाती है।

लेकिन आपका प्रश्न वास्तव में केवल आंतरिक के बारे में नहीं था, आपकी बात थी किस प्रकार का उपयोग करने के लिए क्या करना है?

स्ट्रिंग्स

यह सभी प्रकारों का आधार प्रकार है। यह चार प्रकारों में से एक है, लेकिन जटिल प्रकारों का आधार प्रकार भी है, क्योंकि एक सूची स्ट्रिंग्स की एक सूची है, एक सेट स्ट्रिंग्स का एक सेट है, इत्यादि।

एक रेडिस स्ट्रिंग उन सभी स्पष्ट परिदृश्यों में एक अच्छा विचार है जहां आप एक HTML पृष्ठ संग्रहीत करना चाहते हैं, लेकिन तब भी जब आप अपने पहले से एन्कोड किए गए डेटा को परिवर्तित करने से बचना चाहते हैं। तो उदाहरण के लिए, यदि आपके पास JSON या MessagePack है तो आप ऑब्जेक्ट्स को स्ट्रिंग के रूप में स्टोर कर सकते हैं। रेडिस 2.6 में आप लुआ स्क्रिप्ट का उपयोग करके इस तरह के ऑब्जेक्ट सर्वर साइड में हेरफेर भी कर सकते हैं।

स्ट्रिंग्स का एक और दिलचस्प उपयोग बिटमैप्स है, और सामान्य रूप से बाइट्स के रैंडम एक्सेस सरणियों में, क्योंकि रेडिस बाइट्स की रैंडम रेंज, या सिंगल बिट्स तक पहुंचने के लिए कमांड का निर्यात करता है। उदाहरण के लिए इस अच्छे ब्लॉग पोस्ट की जाँच करें:Redis का उपयोग करके तेज़ आसान रीयल टाइम मेट्रिक्स।

सूचियां

सूचियाँ तब अच्छी होती हैं जब आप सूची के केवल चरम सीमाओं को छू सकते हैं:पूंछ के पास, या सिर के पास। सामान को पृष्ठांकित करने के लिए सूचियां बहुत अच्छी नहीं हैं, क्योंकि यादृच्छिक पहुंच धीमी है, ओ (एन)। सूचियों का अच्छा उपयोग सादे कतार और ढेर हैं, या एक ही स्रोत और गंतव्य के साथ RPOPLPUSH का उपयोग करके एक लूप में प्रसंस्करण आइटम "घुमाने" के लिए हैं। मदों की।

सूचियाँ तब भी अच्छी होती हैं जब हम केवल N वस्तुओं का एक कैप्ड संग्रह बनाना चाहते हैं जहाँ आमतौर पर हम केवल ऊपर या नीचे की वस्तुओं तक पहुँच प्राप्त करते हैं, या जब N छोटा होता है।

सेट

सेट एक अनियंत्रित डेटा संग्रह हैं, इसलिए जब भी आपके पास वस्तुओं का संग्रह होता है तो वे अच्छे होते हैं और संग्रह के अस्तित्व या आकार को बहुत तेज़ तरीके से जांचना बहुत महत्वपूर्ण है। सेट के बारे में एक और अच्छी बात यह है कि यादृच्छिक तत्वों (SRANDMEMBER और SPOP कमांड) को देखने या पॉप करने के लिए समर्थन है।

सेट संबंधों का प्रतिनिधित्व करने के लिए भी अच्छे हैं, उदाहरण के लिए, "उपयोगकर्ता X के मित्र क्या हैं?" इत्यादि। लेकिन इस तरह के सामान के लिए अन्य अच्छी डेटा संरचनाएं क्रमबद्ध सेट हैं जैसा कि हम देखेंगे।

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

छोटे सेट बहुत ही कुशल तरीके से एन्कोड किए जाते हैं।

हैश

हैश फ़ील्ड और मानों से बनी वस्तुओं का प्रतिनिधित्व करने के लिए एकदम सही डेटा संरचना है। HINCRBY का उपयोग करके हैश के क्षेत्रों को परमाणु रूप से भी बढ़ाया जा सकता है। जब आपके पास उपयोगकर्ता, ब्लॉग पोस्ट, या किसी अन्य प्रकार की आइटम . जैसी वस्तुएं हों , यदि आप अपने स्वयं के एन्कोडिंग जैसे JSON या इसी तरह का उपयोग नहीं करना चाहते हैं, तो हैश जाने का रास्ता हो सकता है।

हालांकि, ध्यान रखें कि रेडिस द्वारा छोटे हैश को बहुत कुशलता से एन्कोड किया गया है, और आप रेडिस को परमाणु रूप से GET, SET या व्यक्तिगत क्षेत्रों को बहुत तेजी से बढ़ाने के लिए कह सकते हैं।

संदर्भों का उपयोग करते हुए, लिंक किए गए डेटा संरचनाओं का प्रतिनिधित्व करने के लिए हैश का भी उपयोग किया जा सकता है। उदाहरण के लिए lamernews.com टिप्पणियों के कार्यान्वयन की जाँच करें।

सॉर्ट किए गए सेट

क्रमबद्ध सेट सूची के अलावा, केवल अन्य डेटा संरचनाएं हैं, जो क्रमबद्ध तत्वों को बनाए रखने के लिए हैं . आप सॉर्ट किए गए सेट के साथ कई अच्छी चीजें कर सकते हैं। उदाहरण के लिए, आपके पास हर तरह की टॉप समथिंग . हो सकती है आपके वेब एप्लिकेशन में सूचियाँ। स्कोर के आधार पर शीर्ष उपयोगकर्ता, पृष्ठदृश्यों द्वारा शीर्ष पोस्ट, जो कुछ भी शीर्ष पर है, लेकिन एक एकल रेडिस इंस्टेंस प्रति सेकंड बहुत सारे सम्मिलन और गेट-टॉप-एलिमेंट संचालन का समर्थन करेगा।

क्रमबद्ध सेट, नियमित सेट की तरह, संबंधों का वर्णन करने के लिए उपयोग किया जा सकता है, लेकिन वे आपको वस्तुओं की सूची को पृष्ठांकित करने और क्रम को याद रखने की अनुमति भी देते हैं। उदाहरण के लिए, अगर मुझे उपयोगकर्ता X के दोस्तों को क्रमबद्ध सेट के साथ याद है तो मैं उन्हें स्वीकार किए गए मित्रता के क्रम में आसानी से याद कर सकता हूं।

प्राथमिकता वाली कतारों के लिए क्रमबद्ध सेट अच्छे होते हैं।

सॉर्ट किए गए सेट अधिक शक्तिशाली सूचियों की तरह होते हैं, जहां सूची के मध्य से श्रेणी सम्मिलित करना, हटाना या प्राप्त करना हमेशा तेज़ होता है। लेकिन वे अधिक मेमोरी का उपयोग करते हैं, और O(log(N)) डेटा संरचनाएं हैं।

निष्कर्ष

मुझे आशा है कि मैंने इस पोस्ट में कुछ जानकारी प्रदान की है, लेकिन लैमरन्यूज़ के स्रोत कोड को http://github.com/antirez/lamernews से डाउनलोड करना और यह समझना बेहतर है कि यह कैसे काम करता है। रेडिस से कई डेटा संरचनाएं लैमर न्यूज के अंदर उपयोग की जाती हैं, और इस बारे में कई सुराग हैं कि किसी दिए गए कार्य को हल करने के लिए क्या उपयोग करना है।

व्याकरण टंकण के लिए क्षमा करें, यहाँ आधी रात हो चुकी है और पोस्ट की समीक्षा करने के लिए बहुत थका हुआ है;)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. रेडिस एसिंक एपीआई

  2. रेडिस पर लार्वा कतार में सभी लंबित नौकरियां कैसे प्राप्त करें?

  3. रेडिस सर्वर में कुल कितने कनेक्शन या अधिकतम कनेक्शन उपलब्ध हैं?

  4. सॉकेट.io-redis का उपयोग करने का उदाहरण

  5. <URL> से WebSocket कनेक्शन विफल:WebSocket हैंडशेक के दौरान त्रुटि:अनपेक्षित प्रतिक्रिया कोड:521