2011-09-29 20 views
6

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

अद्यतन: मुझे लगता है कि मुझे इस समस्या का एक और समाधान मिला है - एक साधारण लिंक्ड सूची। तो एक संभावित कार्यान्वयन हो सकता है, कि प्रत्येक उपयोगकर्ता को अपनी "टाइमलाइन बाल्टी" मिलती है, जहां ट्वीट्स के लिए लिंक-डेटा स्वयं संग्रहित हो जाता है (ट्वीट्स "ट्वीट्स" बाल्टी में अलग से संग्रहित हो जाती हैं)। जैसा कि आप जानते होंगे, इस टाइमलाइन-बाल्टी में "पहली" नाम की एक कुंजी होनी चाहिए, जो नवीनतम टाइमलाइन-ऑब्जेक्ट से जुड़ा हुआ है और सूची का प्रारंभिक बिंदु है। टाइमलाइन में एक नया ट्वीट डालने के लिए, टाइमलाइन बाल्टी में बस एक नया आइटम डालें, इस "नई" -लिंक को "पहले" -लिंक को "पहले" -इटम पर सेट करें, उसके बाद, नया आइटम "पहले" बनाएं।

संक्षेप में: एक आइटम सम्मिलित करें के रूप में आप एक लिंक्ड सूची में करना होगा ...

चहचहाना के साथ के रूप में, व्यक्तिगत समय सिर्फ 20 ट्वीट्स उपयोगकर्ता को दिखाया आयोजित करता है। अंतिम 20 ट्वीट प्राप्त करने के लिए, केवल 2 प्रश्न आवश्यक हैं। चीजों को गति देने के लिए, पहली क्वेरी "अगली" द्वारा टैग की गई नवीनतम 20 वस्तुओं को प्राप्त करने के लिए रीक की लिंक-चलने की क्षमता का उपयोग करती है। आखिरकार, दूसरी और आखिरी क्वेरी ट्वीट्स प्राप्त करने के लिए पहली क्वेरी द्वारा गणना की गई कुंजी का उपयोग करती है (मानचित्र/कम करने का उपयोग करके)।

आपके द्वारा अभी तक खोले गए उपयोगकर्ताओं की ट्वीट्स को निकालने के लिए, मैं संबंधित टाइमलाइन-ऑब्जेक्ट्स/ट्वीट्स प्राप्त करने के लिए Riak 1.0 की द्वितीयक अनुक्रमणिका क्षमता का उपयोग करूंगा।

+0

चूंकि रीक 1.4 सॉर्टिंग और पेजिनेशन माध्यमिक इंडेक्स के साथ उपलब्ध है: http://basho.com/basho-announces- उपलब्धता-of-riak-1-4/ – nacmartin

उत्तर

2

रीक कोर के हिस्सों को दोबारा लिखने के बिना रीक में आदेशित रूप में डेटा स्टोर करना संभव नहीं है। डेटा बाल्टी + कुंजी ऑर्डर में लगभग मोटे तौर पर संग्रहीत किया जाता है। वास्तविक आदेश बैकएंड स्टोरेज तंत्र पर निर्भर करता है जिसका आप रीक के लिए उपयोग कर रहे हैं।

Riak 1.0 में कुछ विशेषताएं हैं जो आपकी मदद कर सकती हैं। माध्यमिक इंडेक्स के साथ-साथ मैप कम करने के संचालन में सुधार के लिए समर्थन है - विशेष रूप से, वे अत्यधिक समवर्ती परिदृश्यों में बहुत बेहतर प्रदर्शन करते हैं।

अलेक्जेंडर Siculars ने Pagination with Riak के बारे में एक लेख लिखा था। यह समस्या को अच्छी तरह से रेखांकित करता है। यमर भी रीक का व्यापक उपयोग करते हैं और उनके दो इंजीनियरों ने Riak at Yammer के बारे में एक प्रेजेंटेशन प्रस्तुत किया है। यह कई कार्यान्वयन विवरण में नहीं जाता है, लेकिन आप इस बारे में बहुत कुछ सीख सकते हैं कि उन्होंने अपना समाधान कैसे बनाया है।

द्वितीयक अनुक्रमणिका प्रश्नों और मानचित्र को कम करने से आपकी समस्या को आसानी से हल करना संभव हो जाता है।

0

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

यहाँ रेंज क्वेरी का उपयोग कर सभी कुंजियों को सूचीबद्ध करने के लिए और फिर * riak_kv_mapreduce * :: में कार्यों में बनाया का उपयोग कर उन्हें छँटाई एक उदाहरण है

{ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087), 
riakc_pb_socket:mapred(Pid            
    , {index, colonel_riak:bucket(context), <<"$key">>, <<0>>, <<255>>}  
    , [{reduce, {modfun, riak_kv_mapreduce, reduce_sort}, none, true}]) 

आप erlang में lists मॉड्यूल में कार्यों का उपयोग या उपयोग कर सकते हैं मूल जावास्क्रिप्ट सॉर्ट फ़ंक्शन। Erlang में lists:reverse/1 द्वारा ऑर्डर प्राप्त किया जा सकता है।