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




data-structures redis (2)

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

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

2.शैश - कुंजी मूल्य जोड़े का संग्रह

3. सूची - तारों का एक सम्मिलन-आदेश संग्रह

4.सेट्स - कोई ऑर्डरिंग के साथ अद्वितीय तारों का संग्रह

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

स्ट्रिंग्स

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

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

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

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

हैश

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

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

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

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

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

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

सूचियाँ

रेडिस लिंक्ड सूचियों की तरह कार्य करता है।

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

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

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

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

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

सूचियों पर सभी संभावित संचालन के लिए, सूचियों के दस्तावेज़ देखें

सेट

रेडिस सेट, ठीक है, सेट हैं।

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

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

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

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

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

सॉर्ट किए गए समूह

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

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

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

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

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

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

क्रमबद्ध सेट पर सभी संभावित संचालन के लिए, क्रमबद्ध सेट दस्तावेज़ देखें।

मैं एक निश्चित सूची में दो प्रश्नों का उत्तर देने की कोशिश कर रहा हूं:

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

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

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

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


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

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

  1. तार
  2. शब्दकोश
  3. संदिग्ध लिंक्ड सूची
  4. सूची छोड़ें
  5. ज़िप सूची
  6. Int सेट्स
  7. ज़िप मानचित्र (Redis 2.6 के बाद से ज़िप सूची के पक्ष में बहिष्कृत)

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

1. स्ट्रिंग्स

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

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

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

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

2. शब्दकोश

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

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

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

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

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

3. संदिग्ध लिंक्ड सूचियां

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

4. सूची छोड़ें

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

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

रेडिस 'छोड़ें सूची कार्यान्वयन निम्नलिखित तरीकों से मानक कार्यान्वयन से अलग है:

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

5. ज़िप सूची

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

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

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

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

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

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

6. Int सेट्स

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

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

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

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

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

7. ज़िप मानचित्र

ज़िप मानचित्र एक सूची में flattened और संग्रहीत शब्दकोश हैं। वे ज़िप सूची के समान हैं।

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





redis