मोन्गोबीडी की तुलना में रेडिस कितना तेज है?


204

यह व्यापक रूप से उल्लेख किया गया है कि रेडिस "ब्लेजिंग फास्ट" है और मोंगोबडी भी तेज है। लेकिन, मुझे दो के परिणामों की तुलना करने में वास्तविक संख्या खोजने में परेशानी हो रही है। समान कॉन्फ़िगरेशन, सुविधाओं और संचालन को देखते हुए (और शायद यह दर्शाता है कि कारक अलग-अलग कॉन्फ़िगरेशन और संचालन के साथ कैसे बदलता है), आदि, Redis 10x तेज है ?, 2x तेजी से ?, 5x तेजी से?

मैं केवल प्रदर्शन की बात कर रहा हूं। मैं समझता हूं कि मोंगोबीडी एक अलग उपकरण है और इसमें एक अमीर सुविधा सेट है। यह "रेडियों की तुलना में बेहतर है" mongoDB नहीं है । मैं पूछ रहा हूँ, Redis outperform mongoDB को किस मार्जिन से देखता है

इस बिंदु पर, सस्ते बेंचमार्क भी बेंचमार्क से बेहतर हैं।


10
सस्ते बेंचमार्क हमेशा बिना बेंचमार्क के बेहतर होते हैं। प्रश्न साथी के लिए धन्यवाद।
मझियार

2
सामान्य तौर पर, 5,000 ऑप्स / सेक और 10,000 ऑप्स / सेक के बीच अंतर की देखभाल अक्सर समय से पहले अनुकूलन का मामला होता है। उस ने कहा, यह अभी भी एक दिलचस्प जवाब है :)
केविन

जवाबों:


238

निम्न बेंचमार्क से परिणाम: 2x लिखना, 3x पढ़ना

यहां अजगर में एक सरल बेंचमार्क है जिसे आप अपने उद्देश्यों के लिए अनुकूलित कर सकते हैं, मैं देख रहा था कि प्रत्येक व्यक्ति बस सेटिंग को कैसे ठीक करेगा / करेगा:

#!/usr/bin/env python2.7
import sys, time
from pymongo import Connection
import redis

# connect to redis & mongodb
redis = redis.Redis()
mongo = Connection().test
collection = mongo['test']
collection.ensure_index('key', unique=True)

def mongo_set(data):
    for k, v in data.iteritems():
        collection.insert({'key': k, 'value': v})

def mongo_get(data):
    for k in data.iterkeys():
        val = collection.find_one({'key': k}, fields=('value',)).get('value')

def redis_set(data):
    for k, v in data.iteritems():
        redis.set(k, v)

def redis_get(data):
    for k in data.iterkeys():
        val = redis.get(k)

def do_tests(num, tests):
    # setup dict with key/values to retrieve
    data = {'key' + str(i): 'val' + str(i)*100 for i in range(num)}
    # run tests
    for test in tests:
        start = time.time()
        test(data)
        elapsed = time.time() - start
        print "Completed %s: %d ops in %.2f seconds : %.1f ops/sec" % (test.__name__, num, elapsed, num / elapsed)

if __name__ == '__main__':
    num = 1000 if len(sys.argv) == 1 else int(sys.argv[1])
    tests = [mongo_set, mongo_get, redis_set, redis_get] # order of tests is significant here!
    do_tests(num, tests)

मेंगोडब 1.8.1 और रेडिस 2.2.5 और नवीनतम पाइमोंगो / रेडिस-पी के साथ परिणाम:

$ ./cache_benchmark.py 10000
Completed mongo_set: 10000 ops in 1.40 seconds : 7167.6 ops/sec
Completed mongo_get: 10000 ops in 2.38 seconds : 4206.2 ops/sec
Completed redis_set: 10000 ops in 0.78 seconds : 12752.6 ops/sec
Completed redis_get: 10000 ops in 0.89 seconds : 11277.0 ops/sec

नमक के एक दाने के साथ परिणाम लें! यदि आप दूसरी भाषा में प्रोग्रामिंग कर रहे हैं, तो अन्य क्लाइंट / अलग-अलग कार्यान्वयन आदि का उपयोग करके, आपके परिणाम अलग-अलग होंगे। आपके उपयोग का उल्लेख नहीं करना पूरी तरह से अलग होगा! आपका सबसे अच्छा दांव है कि आप उन्हें स्वयं बेंचमार्क करें, ठीक उसी तरह जिस तरह से आप उन्हें इस्तेमाल करने का इरादा कर रहे हैं। एक कोरोलरी के रूप में आप संभवतः प्रत्येक का उपयोग करने का सबसे अच्छा तरीका समझेंगे । हमेशा अपने लिए बेंचमार्क!


3
यह उल्लेखनीय है कि MongoDB और Redis में अलग-अलग दृढ़ता संरचनाएं हैं, और यह कि Redis केवल एक डेटा स्कीमा का समर्थन करता है जो मेमोरी में फिट होने में सक्षम है। यद्यपि राम सस्ता है, यदि आपको 12-16GB से अधिक डेटा का उपयोग / संग्रह करने की आवश्यकता है, तो मैं देखूंगा कि आपके सर्वर विकल्प क्या दिखते हैं।
ट्रैकर 1

53
@ सिवनी यह पोस्ट बिना किसी बेंचमार्क से स्पष्ट रूप से बताए "रफ" बेंचमार्क से जाती है। "बेंचमार्क भ्रामक हैं" बकवास के साथ एक ट्रोल मत बनो। बेशक विभिन्न परिस्थितियाँ परिणामों को बदल सकती हैं। वापस योगदान करें और अपने स्वयं के बेंचमार्क जमा करें जो आपके मामले और लिंक को इस पद से जांचते हैं, फिर हम सभी आपके "परीक्षित" राय से लाभान्वित होंगे।
होमर

2
@sivann डिफ़ॉल्ट (शिप किया गया) कॉन्फ़िगरेशन वही है जो यह बेंचमार्क परीक्षण कर रहा था। IMHO, डिफ़ॉल्ट कॉन्फ़िगरेशन निर्धारित करता है कि fsync बाड़ के किस तरफ एक पैकेज बैठता है। Redis के लिए, इसे एक मेमोरी सर्वर के रूप में विज्ञापित किया गया है जो लोगों को डेटाबेस के कुल सिस्टम मेमोरी से बड़ा होने पर अन्य विकल्पों का उपयोग करने का आग्रह करता है। MongoDB के लिए, यह एक डेटाबेस के रूप में विज्ञापित है। Postgres fsync को कभी भी बंद नहीं करेगा क्योंकि वे दृढ़ता शिविर में स्पष्ट रूप से हैं। अधिकांश लोग कॉन्फ़िगरेशन को संशोधित नहीं करते हैं, इसलिए यह बेंचमार्क उन मामलों के लिए कुछ हद तक सटीक है।
होमर

4
मैं @sivann साथ, बेंचमार्क आप पोस्ट किया जाता है इस बात से सहमत घातक रूप से त्रुटिपूर्ण। MongoDB बहु-थ्रेडेड है और Redis नहीं है। यदि आपका बेंचमार्क बहु-थ्रेडेड था, तो आप देखेंगे कि MongoDb में मल्टी-कोर मशीन पर वास्तव में उच्चतर थ्रूपुट है।
कॉलिनम

2
@ होमर 6 यहां तक ​​कि मेमोरी-ओरिएंटेड डीबी के लिए, आपको WriteConcern सक्षम (डिफ़ॉल्ट रूप से अक्षम) के साथ परीक्षण करना चाहिए । किसी भी तरह के बेंचमार्क के लिए परीक्षण करना वास्तव में बकवास है। रेड्डी के लिए भी ऐसा ही है। डीबी जो सभी लेनदेन को डिस्क पर सिंक नहीं करते हैं, कम से कम 2 सर्वरों को डेटा की नकल करके सुरक्षा बनाए रखते हैं। इसका मतलब है कि आपके लेखन डिस्क सिंक के लिए इंतजार नहीं करते हैं, लेकिन लौटने से पहले नेटवर्क प्रतिकृति के लिए। त्रुटियों के लिए इंतजार नहीं करना कुछ ठेस पर कभी नहीं किया जाता है। यह पता लगाने की तरह नहीं है कि नेटवर्क केबल नेटवर्क से लिखते समय जुड़ा हुआ है या नहीं।
सिवान

18

कृपया Redis और MongoDB प्रविष्टि प्रदर्शन विश्लेषण के बारे में इस पोस्ट की जाँच करें :

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


15

अच्छा और सरल बेंचमार्क

मैंने रेडिस (2.6.16) और मोंगो (2.4.8) के वर्तमान संस्करणों का उपयोग करके परिणामों को फिर से जानने की कोशिश की और यहाँ परिणाम है

Completed mongo_set: 100000 ops in 5.23 seconds : 19134.6 ops/sec
Completed mongo_get: 100000 ops in 36.98 seconds : 2703.9 ops/sec
Completed redis_set: 100000 ops in 6.50 seconds : 15389.4 ops/sec
Completed redis_get: 100000 ops in 5.59 seconds : 17896.3 ops/sec

साथ ही यह ब्लॉग पोस्ट दोनों की तुलना करता है, लेकिन नोड का उपयोग कर रहा है। यह समय के साथ डेटाबेस में प्रविष्टियों की बढ़ती संख्या के प्रभाव को दर्शाता है।


8

संख्याओं का पता लगाना कठिन होता जा रहा है क्योंकि दोनों एक ही स्थान पर नहीं हैं। सामान्य उत्तर यह है कि जब डेटा सेट किसी एक मशीन की मेमोरी में फिट बैठता है तो रेडिस 10 - 30% तेजी से होता है। डेटा की मात्रा पार हो जाने के बाद, Redis विफल हो जाता है। मानगो एक ऐसी राशि पर धीमा होगा जो भार के प्रकार पर निर्भर करता है। केवल एक प्रकार के लोड के लिए एक उपयोगकर्ता ने हाल ही में परिमाण के 6 से 7 आदेशों (10,000 से 100,000 बार) की मंदी की सूचना दी, लेकिन उस रिपोर्ट में यह भी स्वीकार किया गया कि कॉन्फ़िगरेशन के मुद्दे थे, और यह एक बहुत ही atypical कार्य भार था। जब कोई डेटा डिस्क से पढ़ा जाना चाहिए तो सामान्य रीड हैवी लोड को लगभग 10X तक धीमा कर देता है।

निष्कर्ष: रेडिस तेजी से होगा, लेकिन पूरी तरह से नहीं।


7

यहां 1 वर्ष की उम्र के टॉरनेडो ढांचे में सत्र के प्रदर्शन के बारे में एक उत्कृष्ट लेख है । इसकी तुलना कुछ अलग कार्यान्वयनों में से है, जिनमें से Redis और MongoDB शामिल हैं। लेख में ग्राफ बताता है कि रेडिस इस विशिष्ट उपयोग के मामले में MongoDB से लगभग 10% पीछे है।

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

मेरा मानना ​​है कि इस समस्या का सबसे अच्छा समाधान उन परिस्थितियों के प्रकारों में परीक्षण करना है जो आप अपेक्षा करते हैं।


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

3

मेरे मामले में, प्रदर्शन तुलना में एक निर्धारित कारक क्या रहा है, इसका इस्तेमाल किया जाने वाला MongoDb WriteConcern है। आजकल ज्यादातर मोंगो ड्राइवर ACKNOWLEDGED के लिए डिफॉल्ट राइटकॉन्डर सेट करेंगे जिसका अर्थ है 'RAM को लिखा गया' ( Mongo2.6.3-WriteConcern ), इस संबंध में, यह ज्यादातर राइटिंग ऑपरेशन के लिए रेडिस के लिए तुलनीय था।

लेकिन वास्तविकता आपके आवेदन की जरूरतों और उत्पादन पर्यावरण सेटअप पर निर्भर करती है, आप इस चिंता को WriteConcern.JOURNALED (oplog में लिखे) या WriteConcern.FSYNCED (डिस्क पर लिखे गए) या प्रतिकृति सेट (बैक-अप) के लिए बदलना चाहते हैं। अगर इसकी जरूरत है।

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


0

मुझे लगता है कि दिखाए गए बेंचमार्क पर 2-3X भ्रामक हैं, क्योंकि यदि आप इसे हार्डवेयर पर निर्भर करते हैं तो आप इसे चलाते हैं - मेरे अनुभव से, मशीन 'मजबूत' है, बड़ा अंतर (रेडिस के पक्ष में) शायद, इस तथ्य से होगा कि बेंचमार्क हिट करता है मेमोरी सीमा बहुत तेज होती है।

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

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