2011-08-04 7 views
13

मैं एक नोब का थोड़ा सा हूं, इसलिए मैं यहां जाता हूं ...वेब विकास के लिए कुंजी-मूल्य स्टोर का उपयोग कब करें?

कोई व्यक्ति वेब विकास के लिए कुंजी-मूल्य (रेडिस, मेमकेचे, आदि) स्टोर का उपयोग कब करेगा? एक वास्तविक उपयोग मामला सबसे उपयोगी होगा।

मेरा भ्रम यह है कि एक साधारण डेटाबेस इतना अधिक कार्यात्मक लगता है क्योंकि, मेरी समझ के लिए, यह सब कुछ कर सकता है एक महत्वपूर्ण मूल्य स्टोर प्लस कर सकता है यह आपको फ़िल्टरिंग/क्वेरीिंग करने की अनुमति देता है। मतलब, मेरी समझ के लिए, आप एक कुंजी-मूल्य स्टोर के साथ फ़िल्टर नहीं कर सकते: select * homes where price > 100000

अद्यतन:

के इस उदाहरण अधिक वास्तविक करते हैं। आइए दिखाएं कि StackOverflow एक कुंजी-मूल्य स्टोर (memcache, redis, आदि) का उपयोग करता है।

एक महत्वपूर्ण मूल्य स्टोर कैसे मदद करेगा Stackoverflow होस्टिंग की ज़रूरत है?

+1

बहुत यकीन है कि आप कुंजी-मूल्य स्टोर पर फ़िल्टर कर सकते हैं यदि आप चाहते थे - स्टोर के कार्यान्वयन पर और शायद अपनी खुद की चालाकी पर निर्भर करता है। –

उत्तर

3

कुंजी-मूल्य स्टोर आमतौर पर वास्तव में तेज़ होते हैं, इसलिए उन्हें डेटा के लिए कैश के रूप में रखना अच्छा होता है, जिसे अत्यधिक उपयोग किया जाता है और आपके डीबी पर लोड को कम करने के लिए शायद ही कभी अपडेट किया जाता है।

जैसा कि आपने कहा, आप आमतौर पर प्रश्नों के साथ सीमित हैं (हालांकि MongoDB उन्हें बहुत अच्छी तरह से संभालती है), लेकिन मुख्य मान भंडार ज्यादातर सटीक डेटा तक पहुँचने के लिए हैं: उपयोगकर्ता एक्स के प्रोफ़ाइल, सत्र एक्स की जानकारी, आदि

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

संपादित करें: और "उच्च भार" से, मेरा मतलब है वास्तव में उच्च भार। कुंजी-मूल्य स्टोर शायद ही कभी आवश्यक हैं।

See this comparison of key-value stores.

+0

लिंक के लिए धन्यवाद, बहुत उपयोगी तक। –

+0

क्या आपका उत्तर अभी भी लागू होता है यदि आपके पास प्रति आइटम 1000 आइटम और 8 स्ट्रिंग फ़ील्ड्स के साथ एक जेसन सरणी है जिसे हर 20 सेकंड में रीफ्रेश करने की आवश्यकता होती है और कुंजी को अस्पष्ट खोजकर एक्सेस किया जाएगा? – PirateApp

5

memcached की तरह कुछ (जो स्थायी रूप से डाटा स्टोर करने की इरादा नहीं है) के साथ एक NoSQL प्रकार डेटाबेस भ्रमित न हों।

memcached के लिए विशिष्ट उपयोग कुछ क्वेरी परिणामों को संग्रहीत करना है जिन्हें वेब सर्वर के समूह द्वारा एक्सेस किया जा सकता है - यानी। एक साझा कैश। उदाहरण के लिए। इस पृष्ठ पर संबंधित पोस्ट की एक सूची है और उस सूची का उत्पादन करने के लिए डेटाबेस के लिए कुछ काम संभव है। यदि आप ऐसा करते हैं तो हर बार जब कोई पृष्ठ लोड करता है तो आप डेटाबेस के लिए बहुत सारे काम करेंगे। इसके बजाए, पहली बार एक बार पुनर्प्राप्त परिणाम पृष्ठ आईडी होने के साथ एक मेमकैच सर्वर पर संग्रहीत किए जा सकते हैं। क्लस्टर में से कोई भी वेब सर्वर तब डेटाबेस को लगातार हिट किए बिना उस जानकारी को बहुत तेज़ी से ला सकता है। थोड़ी देर के बाद, कैश प्रविष्टि को memcached द्वारा शुद्ध किया जाएगा ताकि पुराने लेखों के परिणाम अंतरिक्ष का उपयोग न करें। [अस्वीकरण: मुझे नहीं पता कि स्टैक ओवरव्लो वास्तव में ऐसा करता है]।

दूसरी तरफ एक "नोएसक्यूएल" डेटाबेस स्थायी रूप से जानकारी संग्रहीत करने के लिए है। यदि आपका डेटा स्कीमा काफी सरल है और आपके प्रश्न भी हैं, तो यह मानक SQL डेटाबेस से तेज़ हो सकता है। बहुत से वेब अनुप्रयोगों को अत्यधिक जटिल डेटाबेस की आवश्यकता नहीं है, और इसलिए NoSQL डेटाबेस एक अच्छा फिट हो सकता है। जबकि Redis एक स्थायी भंडारण है, लेकिन

+0

आप इसके बजाय संपूर्ण पृष्ठ कैश क्यों नहीं करेंगे? – Jacjoi

+0

आप पृष्ठ के कुछ हिस्सों को कैश कर सकते हैं, लेकिन तब से यह सब नहीं (उदाहरण के लिए) मेरे संस्करण के शीर्ष पर मेरा लॉगिन नाम है। लेकिन यह एक उचित बिंदु है - आप इसे HTML स्निपेट के रूप में बहुत अधिक कैश कर सकते हैं। –

1

बस एक bstrawson के जवाब में जोड़ने, "कैश -d mem-" एक कैशिंग तंत्र है कुंजी-मान पेयर के रूप में दोनों की दुकान डेटा।

एक कुंजी-मूल्य भंडारण (रेडिस या मेम्बेस जैसे कुछ) पर खोजें, जैसे एक रिलेशनल डेटाबेस में सभी मान खोजना बहुत धीमा है।यदि आप कुछ पूछताछ करना चाहते हैं तो आपको दस्तावेज़-उन्मुख नोएसक्यूएल प्रकार डीबी जैसे मोंगोडीबी या कॉच डीबी में स्थानांतरित करने की आवश्यकता हो सकती है, जिसे आप कुछ प्रश्न भाग कर सकते हैं।

निकट भविष्य आप करेंगे Couchbase को संभालने के लिए तोड़ 2.0 जो NoSQL डेटा नव शुरू की UnQL और कैशिंग (सीधे memcached स्रोत कोड से प्राप्त) के द्वारा क्वेरी के साथ अपने सभी जल मुद्दों

3

रहे हैं दो सामान्य रूप से व्यवहार्य उपयोग संबोधित करेंगे सक्षम NoSQL के लिए -cases:

  1. रैपिड अनुप्रयोग विकास
  2. व्यापक स्केलेबल सिस्टम

तथ्य यह है कि अधिकांश नोएसक्यूएल समाधान प्रभावी ढंग से स्कीमा-कम होते हैं; संचालित करने के लिए बहुत कम समारोह की आवश्यकता है; हल्के वजन (एपीआई के मामले में) हैं; और अधिक कैनोलिक रिलेशनल दृढ़ता प्रणालियों के विपरीत महत्वपूर्ण प्रदर्शन लाभ प्रदान करते हैं, उपर्युक्त 2 उपयोग-मामलों (सामान्य अर्थ में) के लिए उनकी उपयुक्तता को सूचित करते हैं।

यह आसान है:

सनकी होने के नाते - - या व्यावसायिक समझ में शायद व्यावहारिक एक NoSQL सिस्टम के लिए एक 3 सामान्य यूज-केस (अभी भी विशेषताओं के ऊपर सेट द्वारा सूचित/सुविधाओं) प्रस्ताव कर सकते हैं ग्रॉक और कोई अनुभवहीन (लेकिन अन-मस्तिष्क-मृत) एस्पिंग गीक इसे स्नैप में उठा सकता है। यह एक बहुत ही शक्तिशाली विशेषता है। (कि Oracle के साथ .. प्रयास करें)

तो, NoSQL प्रणाली के उपयोग के मामलों - जो सामान्य रूप में आराम लगातार सिस्टम विशेषता के रूप में किया जा सकता है - सब बेहतर व्यावहारिक दृष्टिकोण द्वारा सूचित कर रहे हैं।

पूरी तरह से कोई सवाल नहीं है - अत्यधिक बड़े पैमाने पर स्केलेबल सिस्टम के बाहर - कि आरडीबीएमएस सिस्टम औपचारिक रूप से सही सिस्टम हैं जो डेटा अखंडता बीमा करने के लिए डिज़ाइन किए गए हैं।

0

स्टैक ओवरफ़्लो वास्तव में रेडिस का उपयोग करता है, और बड़े पैमाने पर। उदाहरण के रूप में स्टैक ओवरफ़्लो के साथ, अपने प्रश्न का विस्तृत उत्तर, a couple of niceblog posts @Mark Gravell द्वारा। मार्क शानदार Booksleeve पूरी तरह से एसिंक्रोनस .NET Redis बाइंडिंग लाइब्रेरी का लेखक है।

11

मैं किसी कुंजी-मान (यहां केवी) डेटा स्टोर का उपयोग करने के प्रश्न का उत्तर नहीं दे सकता लेकिन मैं आपको कुछ उदाहरण दिखा सकता हूं, और अपने स्टैक ओवरफ्लो उदाहरण का उत्तर दे सकता हूं।

डेटाबेस पहुंच के साथ, आपको जो कुछ चाहिए वह एक केवी स्टोर है। उदाहरण के लिए, उपयोगकर्ता उपयोगकर्ता नाम "जो" के साथ लॉग इन करता है। तो आप अपने डेटाबेस में "उपयोगकर्ता: जो" देखते हैं और अपना पासवर्ड पुनर्प्राप्त करते हैं (निश्चित रूप से हैश)। या हो सकता है कि आपके पास "उपयोगकर्ता: पास: जो" के तहत उसका पासवर्ड हो, यह वास्तव में कोई फर्क नहीं पड़ता। यदि यह स्टैक ओवरफ़्लो था और आप पृष्ठ http://stackoverflow.com/questions/6935566/when-to-use-a-key-value-store-for-web-development प्रस्तुत कर रहे थे, तो आप "प्रश्न: 6935566" देखेंगे और इसका उपयोग करेंगे। यह देखना आसान है कि कैसे केवी स्टोर आपकी अधिकांश समस्याओं को हल कर सकते हैं।

मैं कहना चाहूंगा कि एक केवी स्टोर पारंपरिक आरडीएमएस द्वारा प्रदान की गई कार्यक्षमता का सबसेट है। ऐसा इसलिए है क्योंकि पारंपरिक आरडीएमएस का डिज़ाइन कई स्केलिंग मुद्दों को प्रदान करता है, और आम तौर पर आपके द्वारा स्केल किए जाने पर विशेषताओं को खो देता है। केवी स्टोर इन सुविधाओं के साथ नहीं आते हैं, इसलिए वे आपको सीमित नहीं करते हैं। हालांकि, इन विशेषताओं को अक्सर किसी भी तरह से बनाया जा सकता है, जिसे कोर से स्केलेबल बनाया जा सकता है (क्योंकि यह तुरंत स्पष्ट हो जाता है यदि वे नहीं हैं)।

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

इस समस्या का एक समाधान आपकी चाबियों को शब्दावली से क्रमबद्ध करना और सीमा प्रश्नों की अनुमति देना है। यह अनिवार्य रूप से है "मुझे प्रश्न के बीच सब कुछ दें: 1 और प्रश्न: 5"। अब वह उदाहरण काफी बेकार है, लेकिन सीमा प्रश्नों के कई उपयोग हैं।

आपने कहा कि आप सभी घरों को $ 100 000 से अधिक चाहते हैं। यदि आप ऐसा करने में सक्षम होना चाहते हैं तो आप कीमतों से घरों का सूचकांक बनायेंगे। कहो कि आपके पास निम्नलिखित घर हैं।

house:0 -> {"color":"blue","sold":false,"city":"Stackoverville","price":500000} 
house:1 -> {"color":"red","sold":true,"city":"Toronto","price":150000} 
house:2 -> {"color":"beige","sold":false,"city":"Toronto","price":40000} 
house:3 -> {"color":"blue","sold":false,"city":"The Blogosphere","price":110000} 

एसक्यूएल में आप प्रत्येक फ़ील्ड को कॉलम में स्टोर करेंगे बल्कि इसे सभी में (इस मामले में JSON) दस्तावेज़ में स्टोर करेंगे। और SELECT * FROM houses WHERE price > 100000 हो सकता है। यह सब ठीक और बेवकूफ लगता है, लेकिन अगर कोई इंडेक्स नहीं बनाया गया है, तो इसके लिए आपकी मेज में हर घर को देखने और इसकी कीमत की जांच करने की आवश्यकता है, यदि आपके पास कुछ मिलियन घर हैं, तो धीमा हो सकता है। तो एक केवी स्टोर के साथ आपको एक इंडेक्स की भी आवश्यकता है। मुख्य अंतर यह है कि SQL डेटाबेस चुपचाप धीमी चीज करेगा, जहां केवी स्टोर सक्षम नहीं होगा।

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

house:index:price -> [{"price":500000,"id":"0"},{"price":150000,"id":"1"},{"price":110000,"id":"3"},{"price":40000,"id":"2"}] 

लेकिन आप रेंज प्रश्नों (अक्सर कहा जाता keyscans) अगर आप इस तरह एक सूचकांक बना सकते हैं:

house:index:price:040000 -> 2 
house:index:price:110000 -> 3 
house:index:price:150000 -> 1 
house:index:price:500000 -> 0 

और फिर आप house:index:price:100000 और house:index:price:: (के बीच कुंजी अनुरोध कर सकता है ':' चरित्र '9' के बाद चरित्र है) और आपको [3,1,0] मिलेगा जो सभी घर $ 100 000 से अधिक महंगा है (वे क्रम में भी मददगार हैं)। इसके बारे में एक और अच्छी बात यह है कि वे आपके क्लस्टर के "विभाजन" पर होंगे, इसलिए यह प्रश्न एक ही समय के साथ गाएगा (साथ ही छोटे अतिरिक्त स्थानांतरण ओवरहेड) के साथ ही होगा या दो हो जाएंगे यदि आपकी सीमा खत्म हो जाती है एक सर्वर सीमा (लेकिन इन्हें समानांतर में किया जा सकता है!)।

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

मुझे टोरंटो में बेचे गए घर चाहिए जो $ 100 000 से कम हैं। मुझे बस अपनी अनुक्रमणिका तैयार करना है। (मैंने इसे और अधिक सार्थक बनाने के लिए कुछ घरों में जोड़ा) पहली बार सोचा कि आप हर संपत्ति के लिए एक और इंडेक्स बना सकते हैं, लेकिन आपको जल्दी से एहसास हो जाएगा कि इसका मतलब है कि आपको हर बेचे गए घर का चयन करना होगा और इसे डेटाबेस से डाउनलोड करना होगा। (यह मेरा मतलब था जब मैंने कहा कि स्केलिंग की समस्याएं तुरंत स्पष्ट हैं।) समाधान एक बहु-सूचकांक का उपयोग करना है। एक बार बनाया गया आप वास्तव में इच्छित मूल्यों का चयन कर सकते हैं।

house:index:sold:city:price:f~Fooville~000010:5  -> "" 
house:index:sold:city:price:f~Toronto~040000:2   -> "" 
house:index:sold:city:price:f~Toronto~140000:4   -> "" 
house:index:sold:city:price:t~Stackoverville~500000:0 -> "" 
house:index:sold:city:price:t~The Blogosphere~110000:3 -> "" 
house:index:sold:city:price:t~Toronto~150000:1   -> "" 

अब, अंतिम उदाहरण के विपरीत मैंने आईडी को कुंजी में रखा था। यह दो घरों के समान गुणों की अनुमति देता है। मैं उन्हें मूल्य में विलय कर सकता था लेकिन फिर एक हटाने वाली अनुक्रमणिका जोड़ना अधिक कठिन हो जाता है। मैंने अपने डेटा को ~ से अलग करना भी चुना। ऐसा इसलिए है क्योंकि यह सभी पत्रों के बाद शब्दावली से है, यह सुनिश्चित करना कि पूरा नाम सॉर्ट किया जाएगा और मुझे हर शहर को एक ही लंबाई में पैड नहीं करना है। एक उत्पादन प्रणाली में मैं शायद बाइट 255 या 0 का उपयोग करता हूं।

अब श्रेणी house:index:sold:city:price:f~Toronto~100000 - house:index:sold:city:price:f~Toronto~~ क्वेरी से मेल खाने वाले सभी घरों का चयन करेगी। और ध्यान देने योग्य महत्वपूर्ण बात यह है कि क्वेरी संख्याओं की संख्या के साथ रैखिक रूप से स्केल होती है। इसका मतलब यह है कि आपको उन सभी गुणों के लिए एक इंडेक्स बनाना है जिन्हें आप इंडेक्स करना चाहते हैं (हालांकि हमारे उदाहरण में इंडेक्स बेचे जाने के लिए भी काम करता है, और बेचे गए शहर के प्रश्न)। यह बहुत सारे काम की तरह प्रतीत हो सकता है लेकिन अंत में आप महसूस करते हैं कि यह सिर्फ इतना है कि आप इसे कर रहे हैं, न कि आपके डेटाबेस। मुझे यकीन है कि हम बात जल्द ही बाहर आ रहा इस तरह के लिए पुस्तकालयों देखना शुरू कर देंगे कर रहा हूँ: डी

विषय थोड़ा खींच के बाद, मैं पता चला है:

  • एक केवी की दुकान से कुछ का उपयोग करता है।
  • एक केवी स्टोर में क्वेरी कैसे करें।

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

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