वैसे यह किसी भी कुशल डेटा संग्रहण से अपेक्षित है:शब्दों को पॉइंटर्स द्वारा लिंक की गई कोशिकाओं की गतिशील डेटा संरचना में स्मृति में अनुक्रमित किया जाना है। संरचना का आकार मेटाडेटा, पॉइंटर्स और मेमोरी एलोकेटर आंतरिक विखंडन यही कारण है कि डेटा संबंधित फ्लैट फ़ाइल की तुलना में अधिक मेमोरी लेता है।
रेडिस सेट को हैश टेबल के रूप में लागू किया जाता है। इसमें शामिल हैं:
- ज्यामितीय रूप से बढ़ते संकेतकों की एक सरणी (दो की घात)
- बढ़ती रीहैशिंग सक्रिय होने पर दूसरी सरणी की आवश्यकता हो सकती है
- हैश तालिका में प्रविष्टियों का प्रतिनिधित्व करने वाली एकल-लिंक्ड सूची सेल (3 पॉइंटर्स, प्रति प्रविष्टि 24 बाइट्स)
- Redis ऑब्जेक्ट रैपर (प्रति मान एक) (16 बाइट्स प्रति प्रविष्टि)
- स्वयं वास्तविक डेटा (उनमें से प्रत्येक आकार और क्षमता के लिए 8 बाइट्स द्वारा प्रीफ़िक्स्ड)
उपरोक्त सभी आकार 64 बिट कार्यान्वयन के लिए दिए गए हैं। मेमोरी एलोकेटर ओवरहेड के लिए लेखांकन, इसके परिणामस्वरूप रेडिस जेमलोक एलोकेटर (>=2.4)
का उपयोग करके रेडिस के हाल के संस्करण के लिए प्रति सेट आइटम (डेटा के शीर्ष पर) कम से कम 64 बाइट्स लेता है।रेडिस कुछ डेटा प्रकारों के लिए मेमोरी ऑप्टिमाइज़ेशन प्रदान करता है, लेकिन वे स्ट्रिंग्स के सेट को कवर नहीं करते हैं। यदि आपको वास्तव में सेट की मेमोरी खपत को अनुकूलित करने की आवश्यकता है, तो ऐसी तरकीबें हैं जिनका आप उपयोग कर सकते हैं। मैं ऐसा सिर्फ 160 एमबी रैम के लिए नहीं करूंगा, लेकिन क्या आपके पास बड़ा डेटा होना चाहिए, यहां आप क्या कर सकते हैं।
यदि आपको संघ, प्रतिच्छेदन, सेट की अंतर क्षमताओं की आवश्यकता नहीं है, तो आप अपने शब्दों को हैश ऑब्जेक्ट्स में संग्रहीत कर सकते हैं। लाभ यह है कि हैश ऑब्जेक्ट्स को रेडिस द्वारा ज़िपमैप का उपयोग करके स्वचालित रूप से अनुकूलित किया जा सकता है यदि वे काफी छोटे हैं। zipmap तंत्र को Redis>=2.6 में ziplist द्वारा बदल दिया गया है, लेकिन विचार एक ही है:एक क्रमबद्ध डेटा संरचना का उपयोग करना जो प्रदर्शन और एक कॉम्पैक्ट मेमोरी फ़ुटप्रिंट दोनों प्राप्त करने के लिए CPU कैश में फिट हो सकता है।
यह सुनिश्चित करने के लिए कि हैश ऑब्जेक्ट काफी छोटे हैं, डेटा को कुछ हैशिंग तंत्र के अनुसार वितरित किया जा सकता है। मान लें कि आपको 1M आइटम स्टोर करने की आवश्यकता है, एक शब्द जोड़ना निम्नलिखित तरीके से लागू किया जा सकता है:
- हैश इट मॉड्यूलो 10000 (क्लाइंट साइड पर किया गया)
- HMSET शब्द:[हैशनम] [शब्द] 1
स्टोर करने के बजाय:
words => set{ hi, hello, greetings, howdy, bonjour, salut, ... }
आप स्टोर कर सकते हैं:
words:H1 => map{ hi:1, greetings:1, bonjour:1, ... }
words:H2 => map{ hello:1, howdy:1, salut:1, ... }
...
किसी शब्द के अस्तित्व को पुनः प्राप्त करने या जांचने के लिए, यह वही है (इसे हैश करें और HGET या HEXISTS का उपयोग करें)।
इस रणनीति के साथ, महत्वपूर्ण मेमोरी सेविंग की जा सकती है बशर्ते हैश के मोडुलो को ज़िपमैप कॉन्फ़िगरेशन (या रेडिस के लिए ज़िपलिस्ट> =2.6) के अनुसार चुना गया हो:
# Hashes are encoded in a special way (much more memory efficient) when they
# have at max a given number of elements, and the biggest element does not
# exceed a given threshold. You can configure this limits with the following
# configuration directives.
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
सावधान रहें:इन मापदंडों का नाम Redis>=2.6 के साथ बदल गया है।
यहां, 1M आइटम के लिए मॉड्यूलो 10000 का अर्थ है प्रति हैश ऑब्जेक्ट में 100 आइटम, जो गारंटी देगा कि उन सभी को zipmaps/ziplists के रूप में संग्रहीत किया जाता है।