2011-04-14 11 views
7

मैं रेडिस के लिए नौसिखिया हूं, और मेरे पास कई मिलियन सदस्य आईडी, ईमेल और उपयोगकर्ता नाम का डेटासेट है, और उदाहरण के लिए उन्हें सूची संरचनाओं में संग्रहीत करने के बारे में सोच रहा हूं। मुझे लगता है कि list और sorted set मेरे मामले के लिए सबसे उपयुक्त हो सकता है।रेडिस संरचना, प्रदर्शन

अभी, मैं एक सूची में अनुक्रमित करने के लिए उपयोगकर्ता नाम का पहला अक्षर उपयोग कर रहा हूं और बैक सूची में डेटा पुश कर रहा हूं: rpush list:name:a username,member_id। हालांकि, चूंकि सूची क्रमबद्ध नहीं है, इसलिए कई लाख प्रविष्टियों के भीतर एक निश्चित रिकॉर्ड पुनर्प्राप्त करना धीमा हो जाएगा?

क्या एक क्रमबद्ध सेट (क्योंकि यह सॉर्ट किया गया है) इस मामले में एक सूची से बेहतर होगा? या, क्या आपके पास प्रदर्शन बढ़ाने के लिए कोई अन्य सिफारिश है?

अभिलेखों तक पहुंचने की कुंजी उपयोगकर्ता नाम और ईमेल होना चाहिए।

उत्तर

14

किसी भी इंडेक्स द्वारा किसी सूची को एक्सेस करना जो फ्रंट या एंड के पास नहीं है, महंगा होगा, ओ (एन)। बड़ी सूचियों के लिए, यह बहुत ही कुशल नहीं है।

हैश का उपयोग करना आपकी आवश्यकताओं के लिए बेहतर फिट हो सकता है। यह सूची की तुलना में अधिक स्मृति का उपयोग करेगा, लेकिन लगभग ओ (1) पहुंच प्रदान करेगा।

रेडिस में एक हैश एक नामित कुंजी है जिसमें मनमाने ढंग से फ़ील्ड और मान हो सकते हैं।

आप पूरे उपयोगकर्ता रिकॉर्ड को एक एकल रेडिश हैश में स्टोर कर सकते हैं, जिसका नाम सदस्य_आईडी (उम्मीद है कि यह एक छोटा मूल्य है) का उपयोग कर। ": 42 उपयोगकर्ता" member_id प्रति-उपयोगकर्ता अद्वितीय होने की गारंटी है, तो यहां member_id 42.

hset user:42 email [email protected] 
hset user:42 username foobar 
hset user:42 logincount 0 

redis "कुंजी का नाम" यहाँ है के साथ उपयोगकर्ता के लिए एक हैश पॉप्युलेट करने के लिए कैसे है। प्रत्येक उपयोगकर्ता को एक एकल कुंजी मिल जाएगी, एक SQL डेटाबेस में एक पंक्ति के समान, लेकिन अधिक लचीला। फिर आप दो सहायक हैंश अपडेट कर सकते हैं: एक सदस्य_नाम पर उपयोगकर्ता नामों को मैप करने के लिए, और दूसरा सदस्य पते को सदस्य_आईडी में मैप करने के लिए। यह मानता है कि आपके पास सदस्य_आईडी, उपयोगकर्ता नाम और ईमेल पते के बीच 1: 1 संबंध है।

hset username_to_id foobar 42 
hset email_to_id [email protected] 42 

जब आप, आप पहली बार email_to_id हैश से member_id को देखने के लिए और फिर कुंजी उपयोगकर्ता पर हैश से email क्षेत्र को पुनः प्राप्त करने के लिए एक विशेष उपयोगकर्ता के लिए ईमेल पता देखने की जरूरत है: इसी तरह member_id, आप उपयोगकर्ता नाम से शुरू कर सकते हैं, username_to_id हैश में सदस्य_आईडी देखें, और उसके बाद उपयोगकर्ता में संग्रहीत उपयोगकर्ता रिकॉर्ड प्राप्त करें: member_id हैश। ": उपयोगकर्ता" हैश

redis> hget email_to_id [email protected] 
"42" 
redis> hget user:42 username 
"foobar" 
redis> 

आप के लिए और अधिक क्षेत्रों को जोड़ने के द्वारा उपयोगकर्ता के लिए और अधिक रिकॉर्ड जोड़ सकते हैं:

यहाँ एक ईमेल पते दिए गए उपयोगकर्ता नाम को देख के लिए एक उदाहरण है। आप एक लॉगिन काउंटर बढ़ाने के लिए चाहते हैं, कि रूप में अच्छी तरह स्पष्ट है:

redis> hincrby user:42 login_count 1 
(integer) 1 
redis> hgetall user:42 
1. "email" 
2. "[email protected]" 
3. "username" 
4. "foobar" 
5. "login_count" 
6. "1" 
redis> 

आप redis.io साइट पर more information about hashes पा सकते हैं।

+0

बहुत बहुत धन्यवाद। लेकिन – Leon

+0

को सेट या सॉर्ट क्यों नहीं किया गया है, लेकिन यदि उपयोगकर्ता का 1 मीटर मतलब है तो 1 एम हैश आईडी प्राप्त होता है, जब आप विशेष हो जाते हैं, तो यह प्रदर्शन को कम करेगा – Leon

संबंधित मुद्दे