रेडिस को कब? MongoDB कब करें? [बन्द है]


466

मैं जो चाहता हूं वह रेडिस और मोंगोडीबी के बीच तुलना नहीं है। मुझे पता है कि वे अलग हैं; प्रदर्शन और एपीआई पूरी तरह से अलग है।

रेडिस बहुत तेज है, लेकिन एपीआई बहुत 'परमाणु' है। MongoDB अधिक संसाधन खाएगा, लेकिन एपीआई का उपयोग करना बहुत आसान है, और मैं इससे बहुत खुश हूं।

वे दोनों कमाल के हैं, और मैं जितना हो सके तैनाती में रेडिस का उपयोग करना चाहता हूं, लेकिन यह कोड करना कठिन है। मैं विकास में MongoDB का उपयोग करना चाहता हूं जितना मैं कर सकता हूं, लेकिन इसके लिए एक महंगी मशीन की जरूरत है।

तो आप दोनों के उपयोग के बारे में क्या सोचते हैं? रेडिस कब चुनें? MongoDB कब चुनें?

जवाबों:


308

मैं कहूंगा, यह उस तरह की देव टीम पर निर्भर करता है जो आप हैं और आपके आवेदन की जरूरत है।

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

MongoDB पारंपरिक DB और SQL अनुभव के साथ डेवलपर्स के लिए सरलता, बहुत कम सीखने की अवस्था प्रदान करता है। हालांकि, रेडिस के गैर-पारंपरिक दृष्टिकोण को सीखने के लिए अधिक प्रयास की आवश्यकता है, लेकिन अधिक लचीलापन।

उदाहरण के लिए। एक कैश परत शायद बेहतर Redis में लागू किया जा सकता। अधिक स्कीमा-सक्षम डेटा के लिए, MongoDB बेहतर है। [नोट: दोनों MongoDB और Redis तकनीकी रूप से योजनाबद्ध हैं]

यदि आप मुझसे पूछें, तो मेरी निजी पसंद अधिकांश आवश्यकताओं के लिए रेडिस है।

अंत में, मुझे आशा है कि अब तक आप http://antirez.com/post/MongoDB-and-Redis.html देख चुके हैं


16
फी, मोंगोडब स्कीमलेस है।
22zgür

18
MogoDB स्कीमालेस है। और जैसा कि डेटाबेस में संग्रहीत डेटा बड़ा और बड़ा हो जाता है, MongoDB यह साबित करता है कि यह रेडिस की तुलना में बहुत तेज है। रेडिस केवल तभी तेज होता है जब संग्रहीत डेटा छोटा होता है।
एंडरसन

4
मैं MongoDB के दृष्टिकोण को योजनाबद्ध होने से प्यार करता हूं और फिर इसे ORM लेखकों के लिए छोड़ रहा हूं , जिन्हें उन लोगों के लिए स्कीमा लागू करने की आवश्यकता है। Mongoose एक बहुत अच्छा ORM है, जो आपको जरूरत पड़ने पर आसानी से उपयोग होने वाले स्कीमाओं का परिचय देता है :)
Chev

18
आपको पता होना चाहिए कि मशीन में रैम की मात्रा से रेडिस डेटाबेस का आकार सीमित है। इससे बड़ा और आपको क्लस्टरिंग के बारे में सोचना होगा जो मैनुअल और गहन है।
आकाश अग्रवाल

4
MongoDB एक स्कीमा लागू नहीं करता है, लेकिन मैं एक ऐसे मामले को देखना चाहता हूं, जहां कोई इसे स्कीमा के बिना उपयोग करता है ... यह सब है कि आप स्कीमा शब्द को कैसे परिभाषित करते हैं
रॉबी गुइलफॉयल

236

मैंने अभी देखा कि यह प्रश्न काफी पुराना है। फिर भी, मैं निम्नलिखित पहलुओं को जोड़ने के लायक मानता हूं:

  • यदि आप अभी तक नहीं जानते हैं कि आप अपने डेटा की क्वेरी कैसे करने जा रहे हैं, तो MongoDB का उपयोग करें।

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

  • अपने मौजूदा एप्लिकेशन को तेज़ करने के लिए Redis का उपयोग करें।

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

  • Redis आपके डेटा के आधार पर कोई धारणा नहीं बनाता है।

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

रेडिस का उपयोग कब करें?

  • कैशिंग

    MongoDB का उपयोग करके कैशिंग बस बहुत मायने नहीं रखता है। यह बहुत धीमा होगा।

  • यदि आपके पास अपने DB डिजाइन के बारे में सोचने के लिए पर्याप्त समय है।

    आप बस अपने दस्तावेजों को Redis में नहीं फेंक सकते। आपको अपने डेटा को स्टोर करने और व्यवस्थित करने के तरीके के बारे में सोचना होगा। एक उदाहरण रेडिस में हैश है। वे "पारंपरिक", नेस्टेड ऑब्जेक्ट्स से काफी अलग हैं, जिसका मतलब है कि आपको जिस तरह से नेस्टेड डॉक्यूमेंट्स को स्टोर करना है, उस पर पुनर्विचार करना होगा। एक समाधान हैश के अंदर एक संदर्भ को दूसरे हैश ( कुंजी की तरह कुछ : [दूसरा हैश की आईडी] ) को स्टोर करना होगा । एक और विचार इसे JSON के रूप में संग्रहीत करने के लिए होगा, जो * SQL- पृष्ठभूमि वाले अधिकांश लोगों के लिए काउंटर-सहज ज्ञान युक्त लगता है।

  • यदि आपको वास्तव में उच्च प्रदर्शन की आवश्यकता है ।

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

  • आप परवाह नहीं है, तो यह है कि स्केलिंग के बारे में ज्यादा।

    स्केलिंग रेडिस उतना कठिन नहीं है जितना पहले हुआ करता था। उदाहरण के लिए, आप एक से अधिक प्रॉक्सी सर्वर का उपयोग कर सकते हैं ताकि कई रेडिस उदाहरणों के बीच डेटा वितरित किया जा सके। मास्टर-स्लेव प्रतिकृति वह जटिल नहीं है, लेकिन आपको कई रेडिस-इंस्टेंस के बीच कुंजियों को वितरित करने के लिए आवेदन साइट पर किया जाना चाहिए (जैसे हैश-फ़ंक्शन, मोडुलो आदि का उपयोग करके)। तुलना द्वारा MongoDB स्केलिंग बहुत सरल है।

MongoDB का उपयोग कब करें

  • प्रोटोटाइप, स्टार्टअप, हैकथॉन

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

  • जब आपको अपना स्कीमा जल्दी बदलना होगा।

    क्योंकि कोई स्कीमा नहीं है! पारंपरिक, संबंधपरक डीबीएमएस में तालिकाओं को बदलना दर्दनाक रूप से महंगा और धीमा है। MongoDB आपके अंतर्निहित डेटा पर बहुत सारी धारणाएं न बनाकर इस समस्या को हल करता है। फिर भी, यह एक स्कीमा को परिभाषित करने की आवश्यकता के बिना जहाँ तक संभव हो अनुकूलन करने की कोशिश करता है।

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

आगे की पढाई:


3
यदि आपके पास अपने DB डिजाइन के बारे में सोचने के लिए पर्याप्त समय है। इसे महसूस करने के लिए: मान लीजिए कि आप SO डेटा स्टोर करना चाहते हैं। मोंगो में : बस नेस्टेड उत्तर और टिप्पणियों के साथ पूर्ण प्रश्नों को डंप करें लेकिन रेडिस में आपको निम्नलिखित कार्य करने होंगे: SO ऑन रेडिस
अभिषेक गुप्ता

223

Redis। मान लीजिए कि आपने php में एक साइट लिखी है; जो भी कारण के लिए, यह लोकप्रिय हो जाता है और यह अपने समय से आगे है या उस पर पोर्नो है। आपको पता है कि यह php बहुत धीमी गति से चल रहा है, "मैं अपने प्रशंसकों को खोने वाला हूं क्योंकि वे केवल एक पृष्ठ के लिए 10 सेकंड इंतजार नहीं करेंगे।" आपको अचानक पता चलता है कि एक वेब पेज में एक निरंतर यूआरएल है (यह कभी नहीं बदलता है, वाह), यदि आप करेंगे तो एक प्राथमिक कुंजी, और फिर आप याद करते हैं कि मेमोरी तेज है जबकि डिस्क धीमी है और पीएचपी भी धीमी है। :( फिर आप मेमोरी और इस URL का उपयोग करके एक स्टोरेज मैकेनिज्म का फैशन करते हैं जिसे आप "कुंजी" कहते हैं, जबकि वेबपेज सामग्री जिसे आप "मूल्य" कहते हैं, वह आपके पास है - कुंजी और सामग्री। आप इसे "मेम कैश" कहते हैं। आप रिचर्ड डॉकिन्स को पसंद करते हैं क्योंकि वह बहुत बढ़िया है। आप अपने HTML को कैश करते हैं जैसे कि गिलहरी अपने नट को कैश करती है। आपको अपने बकवास php कोड को फिर से लिखने की आवश्यकता नहीं है। तुम खुश हो। फिर आप देखते हैं कि दूसरों ने इसे किया है - लेकिन आप रेडिस को चुनते हैं क्योंकि दूसरे में बिल्लियों की भ्रामक छवियां हैं, कुछ नुकीले हैं।

मोंगो। आपने एक साइट लिखी है। हेक आपने कई, और किसी भी भाषा में लिखा है। आपको एहसास होता है कि आपका अधिकांश समय बदबूदार एसक्यूएल खंड लिखने में व्यतीत होता है। आप एक डीबीए नहीं हैं, फिर भी आप वहां हैं, बेवकूफ एसक्यूएल बयान लिख रहे हैं ... न केवल एक बल्कि हर जगह गुस्सा। "इसे चुनें, वह चुनें"। लेकिन विशेष रूप से आपको चिड़चिड़ाहट की याद है कि कहां है। जहां lastname "thornton" के बराबर है और फिल्म "bad santa" के बराबर है। Urgh। आप सोचते हैं, "वे डीबीए बस अपना काम क्यों नहीं करते और मुझे कुछ संग्रहीत प्रक्रियाएं देते हैं?" फिर आप कुछ मामूली फ़ील्ड को भूल जाते हैं जैसे कि मिडिलनेम और फिर आपको टेबल को छोड़ना होगा, सभी 10G को बड़ा डेटा निर्यात करना होगा और इस नए फ़ील्ड के साथ दूसरा बनाना होगा, और डेटा को आयात करना होगा - और अगले 14 दिनों के दौरान 10 गुना हो जाएगा नमस्कार, शीर्षक, जैसे बकवास याद रखें प्लस पते के साथ एक विदेशी कुंजी जोड़ना। फिर आप अंदाजा लगाते हैं कि lastname अंतिम होना चाहिए। लगभग एक दिन बदल जाता है। तब तुम कहते हो धृष्टता। मुझे एक वेब साइट / सिस्टम पर जाना है और लिखना है, इस डेटा मॉडल के बारे में कभी भी ध्यान न दें। तो आप Google, "मैं SQL लिखने से नफरत करता हूं, कृपया कोई SQL नहीं, इसे बंद करें" लेकिन 'pops' और 'nosql' पॉप अप करें और फिर आप कुछ सामान पढ़ते हैं और यह कहते हैं कि यह बिना किसी स्कीमा के डेटा को डंप करता है। आपको याद है कि पिछले हफ्ते की फियास्को ने अधिक तालिकाओं और मुस्कान को छोड़ दिया था। तब आप मोंगो चुनते हैं क्योंकि कुछ बड़े लोग जैसे 'एयरबड' एप्ट किराये की साइट इसका इस्तेमाल करते हैं। मिठाई। कोई और डेटा मॉडल नहीं बदलता है क्योंकि आपके पास एक मॉडल है जिसे आप बस बदलते रहते हैं।


तुम क्या मतलब है You don't need to rewrite your crap php code?, kv स्टोर यह कैसे हल करता है? :)
रॉय ली

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

जिस तरह से आपने इस कहानी को बताया, उससे मुझे यह जानने में मदद मिली कि स्कीमा-कम का कमाल क्यों है! बस मुझे बिजली को समझने के लिए एसक्यूएल से निपटने के लिए कुछ साल बचा लिया।
निक पिनेडा

4
'कोई और मॉडल परिवर्तन नहीं' वास्तव में स्थिति पर कब्जा नहीं करता है। जब तक आप अपनी सभी मौजूदा प्रविष्टियों को अपडेट करने के लिए डेटा मोशन कोड नहीं लिखते हैं, तब तक इसकी तरह आपके पास एक ही समय में एक ही DB में रहने वाले 'एन' थोड़े अलग मॉडल होते हैं, और आपको यह पता लगाना होगा कि यह किस मॉडल के साथ काम कर रहा है यह DB से कुछ पढ़ता है।
टेरी कोट्टा

2
एक सबसे अच्छा जवाब मैंने कभी देखा है। यह महान सामग्री है और वास्तव में मुझे जोर से हंसने (शाब्दिक रूप से योग्य नहीं) बना रही है
colbyJax

16

शायद यह संसाधन दोनों के बीच उपयोगी निर्णय लेने में मददगार हो। यह कई अन्य NoSQL डेटाबेस पर भी चर्चा करता है, और उनमें से प्रत्येक के लिए "मैं इसका क्या उपयोग करता हूं" स्पष्टीकरण के साथ विशेषताओं की एक छोटी सूची प्रदान करता है ।

http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis


11

उत्तर देने के लिए कठिन प्रश्न - जैसा कि अधिकांश प्रौद्योगिकी समाधानों के साथ होता है, यह वास्तव में आपकी स्थिति पर निर्भर करता है और चूंकि आपने उस समस्या का वर्णन नहीं किया है जिसे आप हल करने की कोशिश कर रहे हैं, कोई भी समाधान का प्रस्ताव कैसे दे सकता है?

आपको उन दोनों को देखने की आवश्यकता है, जो उनमें से आपकी आवश्यकताओं को पूरा करते हैं।

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


10

Redis एक मेमोरी डेटा स्टोर है, जो इसे डिस्क पर स्थिति को बनाए रख सकता है (पुनः आरंभ करने के बाद पुनर्प्राप्ति को सक्षम करने के लिए)। हालाँकि, इन-मेमोरी डेटा स्टोर होने का मतलब है कि डेटा स्टोर का आकार (एक नोड पर) सिस्टम पर कुल मेमोरी स्पेस (भौतिक रैम + स्वैप स्पेस) से अधिक नहीं हो सकता है। वास्तव में, यह बहुत कम होगा कि जैसा कि रेडिस सिस्टम पर कई अन्य प्रक्रियाओं के साथ उस स्थान को साझा कर रहा है, और यदि यह सिस्टम मेमोरी स्पेस को समाप्त कर देता है तो संभवतः ऑपरेटिंग सिस्टम द्वारा इसे मार दिया जाएगा।

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

Redis और Mongo दोनों को उच्च उपलब्धता, बैकअप और डेटास्टोर के समग्र आकार को बढ़ाने के लिए क्लस्टर किया जा सकता है।


10

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

MongoDB: जटिल डेटा

MongoDB एक डॉक्यूमेंट स्टोर है। SQL- संचालित रिलेशनल डेटाबेस के साथ तुलना करने के लिए: रिलेशनल डेटाबेस अनुक्रमित CSV फ़ाइलों को सरल करता है, प्रत्येक फ़ाइल एक टेबल है; दस्तावेज़ भंडार अनुक्रमित JSON फ़ाइलों को सरल करते हैं, प्रत्येक फ़ाइल एक दस्तावेज़ है, जिसमें कई फाइलें एक साथ समूहीकृत हैं।

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

{
  _id:  0x194f38dc491a,
  Name:  "John Smith",
  PhoneNumber:
    Home: "555 999-1234",
    Work: "555 999-9876",
    Mobile: "555 634-5789"
  Accounts:
    - "379-1111"
    - "379-2574"
    - "414-6731"
}

उपरोक्त दस्तावेज़ में एक कुंजी है PhoneNumber.Mobile, जिसका मूल्य है 555 634-5789। आप दस्तावेजों के संग्रह के माध्यम से खोज सकते हैं जहां कुंजी, PhoneNumber.Mobileकुछ मूल्य है; वे अनुक्रमित हैं।

इसका एक सरणी भी है Accountsजिसमें कई अनुक्रमित हैं। किसी ऐसे दस्तावेज़ के लिए क्वेरी करना संभव है, Accountsजिसमें मानों के कुछ सबसेट होते हैं , सभी मानों के कुछ सबसेट या मानों के कुछ सबसेट में से किसी एक को शामिल किया जाता है। इसका मतलब है कि आप खोज सकते हैंAccounts = ["379-1111", "379-2574"] ऊपर और नहीं ; आप Accounts includes ["379-1111"]उपरोक्त दस्तावेज़ खोज सकते हैं और पा सकते हैं ; और आप खोज सकते Accounts includes any of ["974-3785","414-6731"]हैं और उपरोक्त और जो भी दस्तावेज शामिल हैं, उसे "974-3785", यदि कोई हो

दस्तावेज़ आप चाहते हैं के रूप में गहरे जाते हैं। PhoneNumber.Mobileएक सरणी, या यहां तक ​​कि एक उप-दस्तावेज़ ( PhoneNumber.Mobile.Workऔर PhoneNumber.Mobile.Personal) पकड़ सकता है । यदि आपका डेटा अत्यधिक संरचित है, तो दस्तावेज़ रिलेशनल डेटाबेस से एक बड़ा कदम है।

यदि आपका डेटा ज्यादातर सपाट, संबंधपरक और कठोर रूप से संरचित है, तो आप एक रिलेशनल डेटाबेस के साथ बेहतर हैं। फिर, बड़ा संकेत यह है कि आपके डेटा मॉडल परस्पर संबंधित CSV फ़ाइलों के संग्रह या XML / JSON / YAMT फ़ाइलों के संग्रह के लिए सबसे अच्छा है।

अधिकांश परियोजनाओं के लिए, आपको कुछ छोटे क्षेत्रों में-जहाँ एसक्यूएल या डॉक्यूमेंट स्टोर फिट नहीं होते हैं, को मामूली काम को स्वीकार करते हुए समझौता करना होगा; कुछ बड़े, जटिल प्रोजेक्ट्स के लिए डेटा का व्यापक प्रसार (कई कॉलम; पंक्तियाँ अप्रासंगिक) हैं, यह कुछ डेटा को एक मॉडल में और दूसरे डेटा को किसी अन्य मॉडल में संग्रहीत करने के लिए समझ में आएगा। फेसबुक SQL और एक ग्राफ़ डेटाबेस (जहाँ डेटा नोड्स में डाला जाता है, और नोड्स अन्य नोड्स से जुड़े हैं) दोनों का उपयोग करता है; क्रेगलिस्ट ने MySQL और MongoDB का उपयोग किया था, लेकिन MongoDB पर पूरी तरह से आगे बढ़ रहा था। ये ऐसी जगहें हैं जहां डेटा के स्पैन और रिलेशनशिप में एक मॉडल के तहत महत्वपूर्ण बाधाएं आती हैं।

रेडिस: की-वैल्यू

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

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

अमान्य होने का सबसे स्पष्ट मामला अद्यतन पर है: यदि आप पढ़ते हैं user:Simon:lingots = NOTFOUND, तो आप SELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simonपरिणाम को 100, जैसे भी हो , स्टोर कर सकते हैं SET user:Simon:lingots = 100। फिर जब आप साइमन 5 lingots पुरस्कार, आप पढ़ सकते हैं user:Simon:lingots = 100, SET user:Simon:lingots = 105, और UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simon। अब आपके पास अपने डेटाबेस में और Redis में 105 हैं, और user:Simon:lingotsडेटाबेस को क्वेरी किए बिना प्राप्त कर सकते हैं ।

दूसरा मामला निर्भर जानकारी को अद्यतन कर रहा है। मान लें कि आप किसी पृष्ठ का हिस्सा बनाते हैं और उनके आउटपुट को कैश करते हैं। हेडर खिलाड़ी के अनुभव, स्तर और पैसे की मात्रा को दर्शाता है; खिलाड़ी के प्रोफाइल पेज में एक ब्लॉक होता है जो उनके आंकड़े दिखाता है; इत्यादि। खिलाड़ी कुछ अनुभव हासिल करता है। खैर, अब आप कई है templates:Header:Simon, templates:StatsBox:Simon, templates:GrowthGraph:Simon, और इसके आगे-प्रांगण जहां एक आधा दर्जन डेटाबेस प्रश्नों एक टेम्पलेट इंजन के माध्यम से चलाने के उत्पादन में कैश की गई है। आम तौर पर, जब आप इन पृष्ठों को प्रदर्शित करते हैं, तो आप कहते हैं:

$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
  $t = BuildTemplate("StatsBox.tmpl",
                     GetStatsFromDatabase($playerName));
  SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;

क्योंकि आपने अभी-अभी के परिणामों को अपडेट किया है GetStatsFromDatabase("Simon"), इसलिए आपको templates:*:Simonअपने कुंजी-मूल्य कैश से बाहर करना होगा। जब आप इनमें से किसी भी टेम्प्लेट को रेंडर करने का प्रयास करते हैं, तो आपका एप्लिकेशन आपके डेटाबेस (पोस्टग्रेएसक्यूएल, मोंगोडीबी) से डेटा लाने और इसे आपके टेम्पलेट में डालने पर मंथन करेगा; इसके बाद यह रिडिस में रिजल्ट को स्टोर करेगा और उम्मीद है कि अगली बार जब यह आउटपुट के ब्लॉक को प्रदर्शित करता है तो डेटाबेस क्वेश्चन तैयार करना और टेम्प्लेट करना परेशान नहीं करेगा।

रेडिस आपको प्रकाशक-सदस्यता संदेश कतार और ऐसे भी देता है। यह एक और विषय है। यहाँ बिंदु Redis एक कुंजी-मूल्य कैश है, जो एक संबंधपरक डेटाबेस या दस्तावेज़ स्टोर से भिन्न होता है।

निष्कर्ष

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


2
"कैश अमान्य होना कंप्यूटर विज्ञान की कठिन समस्याओं में से एक है; अन्य चीजों का नामकरण है।" सच है!
१६'१६

2

और आपको न तो उपयोग करना चाहिए, अगर आपके पास भरपूर रैम है। Redis और MongoDB एक सामान्य उद्देश्य उपकरण की कीमत पर आते हैं। यह बहुत सारे ओवरहेड का परिचय देता है।

कहावत थी कि रेडिस मानगो से 10 गुना तेज है। शायद अब वह सच नहीं होगा। MongoDB (अगर मुझे सही से याद है) ने मेमोरी और स्टोरेज दस्तावेजों को मेमोरैच को हरा देने का दावा किया था जब तक कि मेमोरी कॉन्फ़िगरेशन समान हैं।

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


2

Redis और MongoDB दोनों गैर-संबंधपरक डेटाबेस हैं, लेकिन वे विभिन्न श्रेणियों के हैं।

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

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


1

यदि आपकी परियोजना ने आपको अपने वातावरण पर पर्याप्त रैम मेमोरी देने की अनुमति दी है - तो उत्तर रेडिस है। विशेष रूप से क्लस्टर कार्यक्षमता के साथ नए रेडिस 3.2 को ध्यान में रखते हुए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.