रेडिस के लिए अंतर्निहित डेटा संरचनाएं क्या हैं?


305

मैं एक निश्चित सूची में दो सवालों के जवाब देने की कोशिश कर रहा हूं:

  1. रेडिस के लिए अंतर्निहित डेटा संरचनाएं क्या हैं?
  2. और प्रत्येक प्रकार के लिए मुख्य लाभ / नुकसान / उपयोग के मामले क्या हैं?

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

विशेष रूप से, मैं सभी प्रकारों को रेखांकित करने के लिए देख रहा हूं: स्ट्रिंग, सूची, सेट, zset और हैश।

ओह, मैंने इन लेखों को दूसरों के बीच देखा है, अब तक:


7
कैसे एक सर्वर का उपयोग करने के लिए सामान्य ज्ञान है? एक से अधिक एक प्रोग्रामिंग संरचना का उपयोग करने के लिए मैं कैसे निर्धारित करता हूं? यह सीधे प्रोग्रामिंग पर लागू होता है, क्योंकि मैं अलग-अलग उपयोगों के लिए विभिन्न प्रकारों का उपयोग करता हूं।
होमर

2
सर्वर का उपयोग कैसे करना जरूरी नहीं है, लेकिन यह ऑफ-टॉपिक है - और यह वह नहीं है जो आपने पूछा है। विशिष्ट उद्देश्यों के लिए किन डेटा संरचनाओं का उपयोग करना सामयिक होगा, लेकिन यह वह नहीं है जो आपने पूछा था। क्या Redis में इस्तेमाल किया जा हुआ है सामान्य ज्ञान, के बारे में क्यों वे किसी विशेष स्थिति में एक विशेष संरचना का इस्तेमाल किया अनुपस्थित अतिरिक्त तर्क - और इस बिंदु पर, हम क्या मैं पहले से ही कहा करने के लिए वापस आ सामयिक होगा, और Redis करना होता है क्या अप्रासंगिक।
जेरी कॉफिन

5
विषय स्पष्ट रूप से बताता है: "डेटा संरचनाएं क्या हैं और आपको विभिन्न प्रकारों का उपयोग कब करना चाहिए?" वह विषय कैसे है? क्या आप कह रहे हैं कि लिंक्ड सूचियों, हैश और सरणियों के बारे में सीखना प्रोग्रामिंग के लिए अप्रासंगिक है? क्योंकि, मेरा तर्क है कि वे सीधे प्रासंगिक हैं - विशेष रूप से एक सर्वर में जो मुख्य रूप से प्रदर्शन के लिए डिज़ाइन किया गया है। इसके अलावा, वे प्रासंगिक हैं क्योंकि गलत विकल्प का मतलब एक आवेदन से अगले तक काफी कम प्रदर्शन हो सकता है।
होमर

19
antirez का उत्तर इस प्रश्न को फिर से परिभाषित करता है। हर जगह प्रोग्रामर और रेडिस उपयोगकर्ताओं के विरोध में बंद करें।
जॉन शीहान

75
@JerryCoffin सभी उचित सम्मान के साथ, रेडिस एक सॉफ्टवेयर डेवलपमेंट टूल है और सॉफ्टवेयर डेवलपमेंट टूल्स के बारे में सवाल पूछना मजबूती से विषय पर है। तथ्य यह है कि "आप स्रोत से उत्तर प्राप्त कर सकते हैं" एक करीबी कारण नहीं है ... स्रोत से उत्तर प्राप्त करने में घंटों लगेंगे। और रेडिस का बहुत व्यापक रूप से उपयोग किया जाता है इसलिए यह प्रश्न बहुत अधिक स्थानीय नहीं है। स्टैक ओवरफ्लो प्रोग्रामिंग के बारे में सीखने और यह पूछने के बारे में है कि किस डेटा संरचना का उपयोग एक बेतहाशा लोकप्रिय प्रोग्रामिंग टूल द्वारा किया जाता है जो उस लक्ष्य में योगदान देता है। संक्षेप में, मैं इस प्रश्न को बंद करने का कोई कारण खोजने में विफल रहा।
योएल Spolsky

जवाबों:


612

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

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

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

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

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

स्ट्रिंग्स

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

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

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

सूचियाँ

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

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

सेट

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

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

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

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

हैश

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

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

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

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

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

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

प्राथमिकता वाले कतारों के लिए सॉर्ट किए गए सेट अच्छे हैं।

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

निष्कर्ष

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

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


45
यह रेडिस का एकमात्र लेखक है। मैंने उसे ईमेल किया और उसे जवाब देने के लिए कहा। बहुत बहुत धन्यवाद, बहुत साल्वातोर। यह बहुत अच्छी जानकारी है।
होमर

58
धन्यवाद, लेकिन मैं एकमात्र बड़ा योगदानकर्ता नहीं हूं, पीटर नूरुहिस ने वर्तमान कार्यान्वयन के बहुत बड़े हिस्से प्रदान किए :)
एंटीरेज़

1
यदि एक समान स्ट्रिंग कई अलग-अलग सेटों में है, तो क्या स्ट्रिंग की एक ही प्रति संग्रहीत की जाएगी?
११'२२ पर सब्बियन

केवल एक स्किप सूची का उपयोग करके ओ (1) में zscore कैसे है?
मैक्सिम

1
जबकि एक खाल उधेड़नेवाला एक उचित संतुलित पेड़ नहीं है, तो आप एक झालर को "उलटा" यादृच्छिक पेड़ के रूप में देख सकते हैं। वे मूल रूप से थोड़े समान हैं भले ही कार्यान्वयन और लेआउट अलग-अलग हों।
एंटीरेज़ सिप

80

अधिकांश समय, आपको Redis द्वारा उपयोग किए जाने वाले अंतर्निहित डेटा संरचनाओं को समझने की आवश्यकता नहीं है। लेकिन थोड़ा सा ज्ञान आपको CPU v / s मेमोरी ट्रेड ऑफ करने में मदद करता है। यह आपके डेटा को एक कुशल तरीके से मॉडल करने में भी आपकी मदद करता है।

आंतरिक रूप से, Redis निम्नलिखित डेटा संरचनाओं का उपयोग करता है:

  1. तार
  2. शब्दकोश
  3. संदेह से जुड़ी सूची
  4. सूची छोड़ें
  5. जिप सूची
  6. इंट सेट
  7. ज़िप मैप्स (रेडिस 2.6 के बाद से ज़िप सूची के पक्ष में पदावनत)

किसी विशेष कुंजी द्वारा उपयोग किए गए एन्कोडिंग को खोजने के लिए, कमांड का उपयोग करें object encoding <key>

1. तार

रेडिस में स्ट्रिंग्स को सिंपल डायनामिक स्ट्रिंग्स या एसडीएस कहा जाता है । यह एक छोटा सा आवरण char *है जो आपको उपसर्ग के रूप में स्ट्रिंग की लंबाई और मुफ्त बाइट्स की संख्या को स्टोर करने की अनुमति देता है।

क्योंकि स्ट्रिंग की लंबाई संग्रहीत है, स्ट्रलेन एक ओ (1) ऑपरेशन है। इसके अलावा, क्योंकि लंबाई ज्ञात है, रेडिस स्ट्रिंग्स बाइनरी सुरक्षित हैं। यह एक स्ट्रिंग के लिए पूरी तरह से कानूनी है जिसमें अशक्त चरित्र है

स्ट्रिंग्स रेडिस में उपलब्ध सबसे बहुमुखी डेटा संरचना हैं। एक स्ट्रिंग निम्नलिखित में से सभी है:

  1. वर्णों का एक तार जो पाठ को संग्रहीत कर सकता है। SET और GET कमांड देखें ।
  2. एक बाइट सरणी जो बाइनरी डेटा स्टोर कर सकता है।
  3. एक longजो नंबर स्टोर कर सकता है। देखें incr , DECR , INCRBY और DECRBY आदेशों।
  4. एक सरणी (के chars, ints, longsकि कुशल रैंडम एक्सेस अनुमति दे सकते हैं या किसी अन्य डेटा प्रकार)। SETRANGE और GETRANGE कमांड देखें ।
  5. एक बिट ऐरे जो आपको व्यक्तिगत बिट सेट या प्राप्त करने की अनुमति देता है। SETBIT और GETBIT कमांड देखें ।
  6. मेमोरी का एक ब्लॉक जिसे आप अन्य डेटा संरचनाओं के निर्माण के लिए उपयोग कर सकते हैं। यह आंतरिक रूप से ज़िपलिस्ट्स और इनसेट्स के निर्माण के लिए उपयोग किया जाता है, जो कि छोटी संख्या के तत्वों के लिए कॉम्पैक्ट, मेमोरी-कुशल डेटा संरचनाएं हैं। इस पर अधिक नीचे।

2. शब्दकोश

रेडिस निम्नलिखित के लिए एक शब्दकोश का उपयोग करता है :

  1. अपने संबंधित मूल्य के लिए एक कुंजी को मैप करने के लिए, जहां मान एक स्ट्रिंग, हैश, सेट, सॉर्ट सेट या सूची हो सकता है।
  2. इसकी समाप्ति टाइमस्टैम्प की एक कुंजी को मैप करने के लिए।
  3. हैश को लागू करने के लिए, सेट और सॉर्ट किए गए डेटा प्रकार सेट करें।
  4. Redis को उन कमांड्स को मैप करने के लिए जो उन कमांड्स को हैंडल करते हैं।
  5. रेडिस कुंजी को उन ग्राहकों की सूची में मैप करने के लिए जो उस कुंजी पर अवरुद्ध हैं। देखें BLPOP

रेडिस डिक्शनरी को हैश टेबल्स का उपयोग करके कार्यान्वित किया जाता है । क्रियान्वयन की व्याख्या करने के बजाय, मैं सिर्फ रेडिस की विशिष्ट बातें समझाऊंगा:

  1. dictTypeडिस्क्स एक हैश तालिका के व्यवहार का विस्तार करने के लिए बुलाया संरचना का उपयोग करते हैं । इस संरचना में फंक्शन पॉइंटर्स होते हैं, और इसलिए निम्नलिखित ऑपरेशन विस्तार योग्य होते हैं: ए) हैश फ़ंक्शन, बी) कुंजी तुलना, सी) कुंजी विध्वंसक, और डी) मूल्य विध्वंसक।
  2. शब्दकोश murmurhash2 का उपयोग करते हैं । (पहले उन्होंने बीज = 5381 के साथ djb2 ​​हैश फ़ंक्शन का उपयोग किया था , लेकिन तब हैश फ़ंक्शन को murmur2 पर स्विच कर दिया गया थाdjb2 ​​हैश एल्गोरिथम की व्याख्या के लिए यह प्रश्न देखें ।)
  3. Redis इंक्रीमेंटल हैशिंग, भी रूप में जाना जाता का उपयोग करता इंक्रीमेंटल रीसाइज़िंग । डिक्शनरी में दो हैश टेबल हैं। हर बार जब शब्दकोश को छुआ जाता है , तो एक बाल्टी पहली (छोटी) हैश तालिका से दूसरी में माइग्रेट होती है। इस तरह, रेडिस एक महंगे आकार के ऑपरेशन को रोकता है।

Setडेटा संरचना सुनिश्चित करने का कोई डुप्लिकेट देखते हैं एक शब्दकोश का उपयोग करता है। Sorted Setएक तत्व को अपने स्कोर में मैप करने के लिए एक शब्दकोश का उपयोग करता है, यही वजह है कि ZSCORE एक ओ (1) ऑपरेशन है।

3. डबली लिंक्ड लिस्ट

listडेटा प्रकार का उपयोग कर कार्यान्वित किया जाता है दोगुना लिंक सूचियाँ । रेडिस का कार्यान्वयन सीधे-से-एल्गोरिथ्म-पाठ्यपुस्तक है। एकमात्र बदलाव यह है कि रेडिस सूची डेटा संरचना में लंबाई संग्रहीत करता है। यह सुनिश्चित करता है कि LLEN में O (1) जटिलता है।

4. सूचियाँ छोड़ें

Redis Sorted सेट के लिए अंतर्निहित डेटा संरचना के रूप में Skip सूचियों का उपयोग करता है। विकिपीडिया का अच्छा परिचय है। विलियम पुग का कागज स्किप लिस्ट्स: ए प्रोबेबिलिस्टिक अल्टरनेटिव टू बैलेंस्ड ट्रीज़ में अधिक विवरण हैं।

सॉर्ट किए गए सेट एक स्किप सूची और एक शब्दकोश दोनों का उपयोग करते हैं। शब्दकोश प्रत्येक तत्व के स्कोर को संग्रहीत करता है।

रेडिस की स्किप लिस्ट कार्यान्वयन निम्नलिखित तरीकों से मानक कार्यान्वयन से अलग है:

  1. Redis डुप्लिकेट स्कोर की अनुमति देता है। यदि दो नोड्स का स्कोर समान है, तो उन्हें लेक्सोग्राफिक ऑर्डर द्वारा सॉर्ट किया जाता है
  2. प्रत्येक नोड में स्तर 0. पर एक बैक पॉइंटर है। यह आपको स्कोर के रिवर्स ऑर्डर में तत्वों को पार करने की अनुमति देता है।

5. जिप सूची

एक ज़िप सूची एक दोहरी लिंक की गई सूची की तरह है, सिवाय इसके कि यह पॉइंटर्स का उपयोग नहीं करता है और डेटा इनलाइन को संग्रहीत करता है।

एक डबल लिंक्ड सूची में प्रत्येक नोड में 3 पॉइंटर्स होते हैं - एक नोड पर संग्रहीत डेटा को संदर्भित करने के लिए एक फॉरवर्ड पॉइंटर, एक बैकवर्ड पॉइंटर और एक पॉइंटर। पॉइंटर्स को मेमोरी की आवश्यकता होती है (64 बिट सिस्टम पर 8 बाइट्स), और इसलिए छोटी सूचियों के लिए, एक दोगुनी लिंक की गई सूची बहुत अक्षम है।

एक ज़िप लिस्ट तत्वों को क्रमिक रूप से एक रेडिस स्ट्रिंग में संग्रहीत करता है। प्रत्येक तत्व में एक छोटा हेडर होता है जो तत्व की लंबाई और डेटा प्रकार, अगले तत्व को ऑफसेट और पिछले तत्व को ऑफसेट करता है। ये ऑफ़सेट आगे और पीछे की ओर इशारा करते हैं। चूंकि डेटा को इनलाइन में संग्रहीत किया जाता है, इसलिए हमें डेटा पॉइंटर की आवश्यकता नहीं है।

ज़िप सूची का उपयोग छोटी सूची, सॉर्ट किए गए सेट और हैश को संग्रहीत करने के लिए किया जाता है। सॉर्ट किए गए सेटों को एक सूची में समतल किया जाता है जैसे [element1, score1, element2, score2, element3, score3]कि ज़िप सूची में संग्रहीत किया जाता है। Hashes को एक सूची में समतल किया जाता है जैसे [key1, value1, key2, value2]आदि।

ज़िप सूचियों के साथ आप सीपीयू और मेमोरी के बीच एक ट्रेडऑफ बनाने की शक्ति रखते हैं। ज़िप सूची मेमोरी-कुशल हैं, लेकिन वे एक लिंक्ड सूची (या हैश टेबल / स्किप सूची) की तुलना में अधिक सीपीयू का उपयोग करते हैं। ज़िप सूची में एक तत्व खोजना O (n) है। एक नए तत्व को सम्मिलित करने के लिए मेमोरी को पुनः लोड करने की आवश्यकता होती है। इस वजह से, Redis इस एन्कोडिंग का उपयोग केवल छोटी सूचियों, हैश और सॉर्ट किए गए सेट के लिए करता है। आप इस व्यवहार को बदल सकते हैं <datatype>-max-ziplist-entriesऔर <datatype>-max-ziplist-value>redis.conf के मानों में परिवर्तन करके। देखें Redis मेमोरी अनुकूलन, अनुभाग "छोटे कुल डेटा प्रकार के विशेष एन्कोडिंग" अधिक जानकारी के लिए।

Ziplist.c पर टिप्पणी उत्कृष्ट हैं, और आप कोड को पढ़ने के लिए बिना पूरी तरह से इस डेटा संरचना समझ सकते हैं।

6. इंट सेट

Int सेट्स "सॉर्टेड इंटीजर एरर्स" के लिए एक फैंसी नाम है।

रेडिस में, हैश तालिकाओं का उपयोग करके आमतौर पर सेट लागू किए जाते हैं। छोटे सेटों के लिए, एक हैश तालिका अक्षम स्मृति वार है। जब सेट केवल पूर्णांकों से बना होता है, तो एक सरणी अक्सर अधिक कुशल होती है।

एक इंट सेट पूर्णांकों की एक क्रमबद्ध सारणी है। एक तत्व को खोजने के लिए एक द्विआधारी खोज एल्गोरिथ्म का उपयोग किया जाता है। इसमें O (log N) की जटिलता है। इस सरणी में नए पूर्णांकों को जोड़ने के लिए मेमोरी रिक्लेक्शन की आवश्यकता हो सकती है, जो बड़े पूर्णांक सरणियों के लिए महंगा हो सकता है।

एक और मेमोरी ऑप्टिमाइज़ेशन के रूप में, इंट सेट्स अलग-अलग पूर्णांक आकार के साथ 3 वेरिएंट में आते हैं: 16 बिट्स, 32 बिट्स और 64 बिट्स। Redis तत्वों के आकार के आधार पर सही संस्करण का उपयोग करने के लिए पर्याप्त स्मार्ट है। जब एक नया तत्व जोड़ा जाता है और यह वर्तमान आकार से अधिक हो जाता है, तो रेडिस स्वचालित रूप से इसे अगले आकार में स्थानांतरित कर देता है। यदि कोई स्ट्रिंग जोड़ा जाता है, तो Redis Int सेट को स्वचालित रूप से एक नियमित हैश टेबल आधारित सेट में बदल देता है।

इंट सेट सीपीयू और मेमोरी के बीच एक ट्रेडऑफ है। इंट सेट बेहद मेमोरी कुशल होते हैं, और छोटे सेट के लिए वे हैश टेबल से तेज होते हैं। लेकिन तत्वों की एक निश्चित संख्या के बाद, O (लॉग एन) पुनर्प्राप्ति समय और वास्तविक मेमोरी की लागत बहुत अधिक हो जाती है। प्रयोगों के आधार पर, एक नियमित हैश तालिका पर स्विच करने के लिए इष्टतम सीमा 512 पाई गई थी। हालांकि, आप अपने आवेदन की जरूरतों के आधार पर इस सीमा को कम कर सकते हैं (यह कम नहीं होता है)। set-max-intset-entriesRedis.conf में देखें ।

7. जिप मैप्स

जिप मानचित्रों को एक सूची में समतल और संग्रहीत किया जाता है। वे जिप सूची के समान हैं।

Redis 2.6 के बाद से ज़िप मैप्स को हटा दिया गया है, और छोटे हैश को ज़िप सूची में संग्रहीत किया गया है। इस एन्कोडिंग के बारे में अधिक जानने के लिए, zipmap.c में टिप्पणियों का संदर्भ लें ।


2

मूल्‍यों की ओर इशारा करते हुए रेडिस स्‍टोर की। कुंजी किसी भी बाइनरी वैल्यू को उचित आकार तक ले सकती हैं (शॉर्ट एएससीआई स्ट्रिंग्स का उपयोग पठनीयता और डीबगिंग उद्देश्यों के लिए किया जाता है)। मान पांच मूल रेडिस डेटा प्रकारों में से एक हैं।

1. स्ट्रिंग्स - बाइनरी सुरक्षित बाइट्स का एक क्रम 512 एमबी तक

२.शेस - मुख्य मूल्य युग्मों का संग्रह

3. लिस्ट - स्ट्रिंग्स का इन-इंसर्शन-ऑर्डर कलेक्शन

4. सेट - बिना किसी आदेश के साथ अद्वितीय तार का एक संग्रह

5. सेट सेट - उपयोगकर्ता द्वारा निर्धारित स्कोरिंग द्वारा आदेशित अद्वितीय तार का एक संग्रह

स्ट्रिंग्स

रेडिस स्ट्रिंग बाइट्स का एक क्रम है।

रेडिस में स्ट्रिंग्स द्विआधारी सुरक्षित हैं (जिसका अर्थ है कि उनकी कोई ज्ञात लंबाई है जो किसी विशेष समाप्ति वर्ण द्वारा निर्धारित नहीं है), इसलिए आप एक स्ट्रिंग में 512 मेगाबाइट तक कुछ भी स्टोर कर सकते हैं।

स्ट्रिंग्स कैन्यिकल "की-वैल्यू स्टोर" अवधारणा हैं। आपके पास एक मान की ओर इशारा करते हुए एक कुंजी है, जहां कुंजी और मूल्य दोनों पाठ या बाइनरी स्ट्रिंग्स हैं।

स्ट्रिंग्स पर सभी संभव संचालन के लिए, http://redis.io/commands/#string देखें

हैश

एक रेडिस हैश प्रमुख मूल्य जोड़े का एक संग्रह है।

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

आप एक रेडिस हैश को दो तरह से सोच सकते हैं: एक प्रत्यक्ष वस्तु प्रतिनिधित्व के रूप में और कई छोटे मूल्यों को कॉम्पैक्ट रूप से संग्रहीत करने के तरीके के रूप में।

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

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

हैश पर सभी संभव संचालन के लिए, हैश डॉक्स देखें

सूचियाँ

रेडिस सूचियाँ लिंक की गई सूचियों की तरह काम करती हैं।

आप सूची में से किसी एक के सिर या पूंछ से सूचियाँ डाल सकते हैं, हटा सकते हैं, और निकाल सकते हैं।

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

Redis सूचियों को अक्सर निर्माता / उपभोक्ता कतारों के रूप में उपयोग किया जाता है। सूची में आइटम डालें फिर सूची से आइटम पॉप करें। यदि आपके उपभोक्ता सूची में कोई तत्व नहीं रखने की कोशिश करते हैं तो क्या होता है? आप Redis को एक तत्व के प्रकट होने का इंतजार करने के लिए कह सकते हैं और इसे जोड़े जाने पर तुरंत आपको वापस कर सकते हैं। यह Redis को एक वास्तविक समय संदेश कतार / घटना / नौकरी / कार्य / अधिसूचना प्रणाली में बदल देता है।

आप किसी सूची के दोनों सिरों को परमाणु रूप से हटा सकते हैं, जिससे किसी भी सूची को स्टैक या कतार के रूप में माना जा सकता है।

आप प्रत्येक प्रविष्टि के बाद अपनी सूची को एक विशिष्ट आकार में ट्रिम करके निश्चित-लंबाई सूची (कैप्ड संग्रह) बनाए रख सकते हैं।

सूचियों के सभी संभावित कार्यों के लिए, सूची डॉक्स देखें

सेट

रेडिस सेट, वेल, सेट हैं।

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

सेट में सदस्यता की जाँच, प्रविष्टि और सदस्यों को हटाने के लिए सेट तेज़ हैं।

सेट में कुशल सेट ऑपरेशन होते हैं, जैसा कि आप उम्मीद करेंगे। आप एक ही बार में कई सेटों के मिलन, अंतरंगता और अंतर को ले सकते हैं। परिणाम या तो कॉलर को वापस किए जा सकते हैं या बाद में उपयोग के लिए नए सेट में परिणाम संग्रहीत किए जा सकते हैं।

सेट में सदस्यता जांच के लिए निरंतर समय का उपयोग होता है (सूचियों के विपरीत), और रेडिस में सुविधाजनक यादृच्छिक सदस्य को हटाने और लौटने ("सेट से एक यादृच्छिक तत्व पॉप)" या यादृच्छिक सदस्य प्रतिस्थापन के बिना लौट रहा है ("मुझे 30 यादृच्छिक-ईश अद्वितीय उपयोगकर्ता दें) ") या प्रतिस्थापन के साथ (" मुझे 7 कार्ड दें, लेकिन प्रत्येक चयन के बाद, कार्ड वापस डालें ताकि इसे फिर से नमूना लिया जा सके ")।

सेट पर सभी संभावित संचालन के लिए, सेट डॉक्स देखें ।

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

Redis सॉर्ट किए गए सेट उपयोगकर्ता द्वारा परिभाषित ऑर्डर के साथ सेट होते हैं।

सादगी के लिए, आप अनूठे तत्वों के साथ बाइनरी ट्री के रूप में सेट किए गए सॉर्ट के बारे में सोच सकते हैं। (Redis सॉर्ट किए गए सेट वास्तव में सूचियों को छोड़ते हैं ।) तत्वों का क्रम क्रम प्रत्येक तत्व के स्कोर से परिभाषित होता है।

सॉर्ट किए गए सेट अभी भी सेट हैं। तत्व केवल एक बार एक सेट में दिखाई दे सकते हैं। एक तत्व, विशिष्टता उद्देश्यों के लिए, इसकी स्ट्रिंग सामग्री द्वारा परिभाषित किया गया है। सॉर्टिंग 3 के साथ एलिमेंट "ऐप्पल" डालें, फिर अपने सॉर्ट किए गए सेट में 500 के सॉर्टिंग स्कोर के साथ एक एलीमेंट "ऐप्पल" में 500 के स्कोर के साथ "ऐप्पल" को सम्मिलित करें। सेट केवल डेटा पर आधारित अद्वितीय होते हैं, न कि आधारित (स्कोर, डेटा) जोड़े।

सुनिश्चित करें कि आपका डेटा मॉडल स्ट्रिंग सामग्री पर निर्भर करता है और विशिष्टता के लिए तत्व का स्कोर नहीं। स्कोर को दोहराए जाने की अनुमति है (या यहां तक ​​कि शून्य), लेकिन, एक अंतिम बार, सेट किए गए तत्व केवल एक बार सेट किए गए समय तक मौजूद हो सकते हैं। उदाहरण के लिए, यदि आप प्रत्येक उपयोगकर्ता लॉगिन के इतिहास को सॉर्ट किए गए सेट के रूप में संग्रहीत करने का प्रयास करते हैं, तो स्कोर लॉगिन और उपयोगकर्ता आईडी के मान को बनाते हुए, आप अपने सभी उपयोगकर्ताओं के लिए केवल अंतिम लॉगिन युग का भंडारण करेंगे। आपका सेट आपके उपयोगकर्ताबेस के आकार तक बढ़ जाएगा, न कि आपके उपयोगकर्ताबेस के वांछित आकार * लॉगिन।

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

आप कुछ अलग तरीकों से तत्वों को पुनः प्राप्त कर सकते हैं। चूंकि सब कुछ क्रमबद्ध है, आप सबसे कम स्कोर से शुरू होने वाले तत्वों के लिए पूछ सकते हैं। आप उच्चतम स्कोर ("रिवर्स") में शुरू होने वाले तत्वों के लिए पूछ सकते हैं। आप प्राकृतिक या रिवर्स ऑर्डर में उनके सॉर्ट स्कोर द्वारा तत्वों के लिए पूछ सकते हैं।

सॉर्ट किए गए सेट पर सभी संभव संचालन के लिए, सॉर्ट किए गए सेट डॉक्स देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.