आंतरिक रूप से, Redis सबसे कुशल तरीके से स्ट्रिंग्स को स्टोर करता है। मूलांक 10 स्ट्रिंग्स में पूर्णांकों को ज़बरदस्ती करने से वास्तव में अधिक मेमोरी का उपयोग होगा।
यहां बताया गया है कि रेडिस स्ट्रिंग्स को कैसे स्टोर करता है -
- 100000 से कम के पूर्णांक एक साझा मेमोरी पूल में संग्रहीत हैं, और कोई मेमोरी ओवरहेड नहीं है। यदि आप चाहें, तो आप स्थिर REDIS_SHARED_INTEGERS को redis.h में बदलकर और Redis को पुन:संकलित करके इस सीमा को बढ़ा सकते हैं।
- 10000 से अधिक पूर्णांक और लंबी अवधि के भीतर 8 बाइट्स का उपभोग करते हैं।
- नियमित तार लेन (स्ट्रिंग) + लंबाई के लिए 4 बाइट्स + खाली स्थान को चिह्नित करने के लिए 4 बाइट्स + नल टर्मिनेटर के लिए 1 बाइट + मॉलोक ओवरहेड्स के लिए 8 बाइट्स लेते हैं।
आपके द्वारा उद्धृत उदाहरण में, यह स्ट्रिंग के लिए लंबे v/s 21 बाइट्स के लिए 8 बाइट्स का प्रश्न है।
संपादित करें:
तो अगर मेरे पास संख्याओं का एक सेट 10,000 से कम है, तो रेडिस मेरे सेट को कैसे स्टोर करता है?
यह इस बात पर निर्भर करता है कि आपके पास कितने तत्व हैं।
यदि आपके सेट में 512 से कम तत्व हैं (देखें set-max-intset-entries
), फिर सेट को एक इंटसेट के रूप में संग्रहीत किया जाएगा। एक IntSet एक सॉर्ट किए गए पूर्णांक सरणी के लिए एक गौरवशाली नाम है। चूँकि आपकी संख्या 10000 से कम है, यह प्रति तत्व 16 बिट्स का उपयोग करेगा। यह (लगभग) एक सी सरणी के रूप में स्मृति कुशल है।
यदि आपके पास 512 से अधिक तत्व हैं, तो सेट हैशटेबल बन जाता है। सेट में प्रत्येक तत्व robj
. नामक संरचना में लिपटा हुआ है , जिसका ओवरहेड 16 बाइट्स है। robj
संरचना में पूर्णांकों के साझा पूल के लिए एक सूचक है, इसलिए आप पूर्णांक के लिए कुछ भी अतिरिक्त भुगतान नहीं करते हैं। और अंत में, robj
इंस्टेंस को हैशटेबल में संग्रहीत किया जाता है, और हैशटेबल में एक ओवरहेड होता है जो सेट के आकार के समानुपाती होता है।
यदि आप वास्तव में रुचि रखते हैं कि कोई तत्व कितनी मेमोरी की खपत करता है, तो अपने डेटासेट पर redis-rdb-tools चलाएं (अस्वीकरण:मैं इस टूल का लेखक हूं)। या आप मेमोरी कॉलबैक वर्ग के लिए स्रोत कोड पढ़ सकते हैं, टिप्पणियां बताती हैं कि स्मृति कैसे निर्धारित की जाती है।