2013-04-22 13 views
8

में 32 बिट हस्ताक्षरित पूर्णांक को संग्रहीत करने के लिए मेमोरी कुशल तरीका है क्योंकि रेडिस 64 बिट हस्ताक्षरित पूर्णांक पर तारों को पार्स करने का प्रयास करते हैं, क्या रेडिक्स 10 पूर्णांक तारों के बजाय 32 बिट हस्ताक्षरित पूर्णांक के बाइनरी प्रतिनिधित्व को स्टोर करना एक अच्छा विचार है?रेडिस

हमारे सिस्टम में हमारे पास 32 बिट हस्ताक्षरित पूर्णांक आईडी की सूचियां हैं।

I can store them like 
lpush mykey 102450 --> redis cast 102450 to 8 bytes long 

or store it like 
lpush mykey \x00\x01\x19\x32 ---> this is just 4 bytes 

उत्तर

17

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

  1. पूर्णांकों कम से कम 10000 एक साझा स्मृति पूल में जमा हो जाती है, और किसी भी स्मृति ओवरहेड्स नहीं है -

    यहाँ कैसे Redis भंडार स्ट्रिंग्स है। यदि आप चाहें, तो आप निरंतर REDIS_SHARED_INTEGERS in redis.h को बदलकर और Redis को पुन: संकलित करके इस सीमा को बढ़ा सकते हैं।

  2. 10000 से अधिक इंटीग्रेटर्स और लंबी बाइट 8 बाइट्स के भीतर।
  3. रेगुलर स्ट्रिंग्स लेंस (स्ट्रिंग) + 4 बाइट्स लम्बाई + 4 बाइट्स के लिए फ्री स्पेस को चिह्नित करने के लिए + 1 बाइट नल टर्मिनेटर + 8 बाइट्स मॉलोक ओवरहेड्स के लिए लेते हैं।

उदाहरण में आपने उद्धृत किया है, यह स्ट्रिंग के लिए लंबे वी/एस 21 बाइट्स के लिए 8 बाइट्स का प्रश्न है।

संपादित करें:

तो मैं 10,000 कैसे Redis मेरे संग्रह करने के लिए करता है की तुलना में सभी कम संख्या का एक सेट है तो क्या होगा?

यह आपके कितने तत्वों पर निर्भर करता है।

यदि आपके सेट में 512 से कम तत्व हैं (set-max-intset-entries देखें), तो सेट इंटसेट के रूप में संग्रहीत किया जाएगा। एक इंटसेट एक सॉर्टेड इंटीजर ऐरे के लिए एक गौरवशाली नाम है। चूंकि आपकी संख्या 10000 से कम है, इसलिए यह प्रति तत्व 16 बिट्स का उपयोग करेगी। यह एक सी सरणी के रूप में स्मृति कुशल के रूप में (लगभग) है।

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

यदि आप रुचि रखते हैं कि तत्व कितना मेमोरी लेता है, तो अपने डेटासेट पर redis-rdb-tools चलाएं। या आप कक्षा MemoryCallback कक्षा के लिए स्रोत कोड पढ़ सकते हैं, टिप्पणियां बताती हैं कि स्मृति कैसे निर्धारित की जाती है।

+0

आपके उत्तर के लिए धन्यवाद। क्या आप साझा मेमोरी पूल के बारे में कुछ और बताएं। तो अगर मेरे पास 10,000 से कम संख्या का सेट है तो रेडिस मेरे सेट को कैसे स्टोर करता है? – Aresn

+0

@Aresn - मेरे उत्तर के अपडेट देखें। यदि आप 10000 से कम पूर्णांक के सेट संग्रहीत कर रहे हैं, तो रेडिस बहुत कुशल स्मृति के अनुसार होंगे। –

+0

@ श्रीपति-कृष्णन क्या आप यह निर्दिष्ट नहीं कर सकते कि स्ट्रिंग कुंजियों को स्टोर करने के लिए कितने बाइट्स का उपयोग किया जाता है? क्या "लेन() + 4 + 4 + 1 + 8 बाइट" केवल मूल्यों पर लागू होता है? हमें जोड़े स्ट्रिंग (43) => int का वास्तव में बड़ा डेटा सेट स्टोर करने की आवश्यकता है और वॉल्यूम का मूल्यांकन करने की आवश्यकता है। जानकारी के लिए वैसे भी धन्यवाद! –

1

तार लंबाई के साथ जमा हो जाती है, तो यह डेटाबेस में सिर्फ 4 बाइट्स नहीं होगा - यह शायद, 4 बाइट डेटा 4 बाइट्स लंबाई + गद्दी के रूप में जमा है, तो आप कुछ भी हासिल नहीं है।