মঙ্গোডিবিয়ের তুলনায় রেডিস কতটা দ্রুত?


204

এটি ব্যাপকভাবে উল্লেখ করা হয়েছে যে রেডিস হ'ল "ব্লেজিং ফাস্ট" এবং মঙ্গোডিবিও দ্রুত। তবে, দুজনের ফলাফলের তুলনায় প্রকৃত সংখ্যাগুলি খুঁজে পেতে আমার সমস্যা হচ্ছে। অনুরূপ কনফিগারেশন, বৈশিষ্ট্য এবং ক্রিয়াকলাপ দেওয়া (এবং সম্ভবত বিভিন্ন কনফিগারেশন এবং ক্রিয়াকলাপগুলির সাথে ফ্যাক্টরটি কীভাবে পরিবর্তিত হচ্ছে তা দেখানো হচ্ছে) ইত্যাদি, রেডিস 10x দ্রুত ?, 2x দ্রুত ?, 5x দ্রুত?

আমি কেবল পারফরম্যান্সের কথা বলছি। আমি বুঝতে পারি যে মঙ্গোডিবি একটি আলাদা সরঞ্জাম এবং আরও উন্নত বৈশিষ্ট্য সেট রয়েছে। এটি "রেডিসের চেয়ে ইজ মঙ্গোডিবি" ভাল নয় । আমি জিজ্ঞাসা করছি, রেডিস কোন প্রান্তে মঙ্গোডিবি ছাড়িয়ে যায়?

এই মুহুর্তে, সস্তা মাপদণ্ডগুলি কোনও মানদণ্ডের চেয়ে ভাল।


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)

মোংডব্ব ১.৮.১ এবং রেডিস ২.২.৫ এবং সর্বশেষ পিমোঙ্গো / রেডিস-পাই সহ ফলাফলগুলি:

$ ./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

অবশ্যই লবণের এক দানা দিয়ে ফলাফল নিন! আপনি যদি অন্য ভাষায় প্রোগ্রামিং করে থাকেন, অন্য ক্লায়েন্ট / বিভিন্ন বাস্তবায়ন, ইত্যাদি ব্যবহার করে আপনার ফলাফলগুলি বিভিন্ন রকমের হয়। আপনার ব্যবহার সম্পূর্ণ ভিন্ন হবে না উল্লেখ করা! আপনার সেরা বাজি হ'ল সেগুলি নিজেই বেনমার্ক করা, আপনি যেভাবে সেগুলি ব্যবহার করতে চান তা ঠিক in একটি ছদ্মবেশ হিসাবে আপনি সম্ভবত প্রতিটি ব্যবহারের সেরা উপায় বের করতে পারেন। সর্বদা নিজের জন্য মানদণ্ড!


3
এটি মন্তব্য করার মতো যে মঙ্গোডিবি এবং রেডিসের বিভিন্ন দৃ pers়তার কাঠামো রয়েছে এবং রেডিস কেবলমাত্র একটি ডেটা স্কিমা সমর্থন করে যা স্মৃতিতে ফিট করতে সক্ষম। যদিও রাম সস্তা, আপনার যদি 12-16 গিগাবাইটের বেশি ডেটা ব্যবহার / সঞ্চয় করতে হয় তবে আমি আপনার সার্ভারের বিকল্পগুলি দেখতে কেমন তা দেখতে পাচ্ছি।
ট্র্যাকার 1

53
@ সিভান এই পোস্টটি কোনও মানদণ্ড থেকে স্পষ্টভাবে বর্ণিত "রুক্ষ" মানদণ্ডে যায় না। "বেঞ্চমার্কগুলি বিভ্রান্ত করছে" বাজে কথা বলে ট্রোল হবেন না। অবশ্যই বিভিন্ন শর্ত ফলাফল পরিবর্তন করতে পারে। পিছনে অবদান রাখুন এবং আপনার নিজস্ব মানদণ্ডগুলি জমা দিন যা আপনার কেস পরীক্ষা করে এবং এর পরিবর্তে এই পোস্ট থেকে লিঙ্ক করে, তারপরে আমরা সবাই আপনার "পরীক্ষিত" মতামত থেকে উপকৃত হব।
হোমার

2
@ সিভান ডিফল্ট (শিপড) কনফিগারেশনটি এই বেঞ্চমার্কটি পরীক্ষা করে। আইএমএইচও, ডিফল্ট কনফিগারেশন নির্ধারণ করে যে কোনও প্যাকেজ fsync বেড়ের পাশে বসে। রেডিসের জন্য, এটি একটি মেমরি সার্ভার হিসাবে বিজ্ঞাপন দেওয়া হয় যা ডেটাবেস মোট সিস্টেমের মেমরির চেয়ে বড় হলে লোকেরা অন্যান্য বিকল্প ব্যবহার করার আহ্বান জানায়। মঙ্গোডিবির পক্ষে এটি ডেটাবেস হিসাবে বিজ্ঞাপন দেওয়া হয়েছে। পোস্টগ্রিস কখনই বিস্মরণ বন্ধ করবে না কারণ তারা দৃ clearly়তার সাথে শিবিরে রয়েছেন। বেশিরভাগ লোকেরা কনফিগারেশনগুলি সংশোধন করে না, তাই এই ক্ষেত্রে এই মানদণ্ডটি কিছুটা সঠিক।
হোমার

4
আমি @ সিভান এর সাথে একমত, আপনার পোস্ট করা মানদণ্ড মারাত্মক ত্রুটিযুক্ত। মঙ্গোডিবি মাল্টি-থ্রেডেড এবং রেডিস নয়। যদি আপনার মানদণ্ডটি বহু-থ্রেডযুক্ত হয় আপনি দেখতে পাবেন যে মংগাডিবির একটি মাল্টি-কোর মেশিনে আসলে উচ্চতর থ্রুপুট রয়েছে।
কলিনম

2
@ হোমার even এমনকি মেমরি-ভিত্তিক ডিবি-র জন্য, আপনার WritConcern সক্ষম (ডিফল্টরূপে অক্ষম) দিয়ে পরীক্ষা করা উচিত । বিনা পরীক্ষা করা যে কোনও ধরণের বেঞ্চমার্কের জন্য সত্যই বাজে। Reddis জন্য অনুরূপ। যে সমস্ত ডিবি সমস্ত লেনদেন ডিস্কে সিঙ্ক করে না, তারা কমপক্ষে 2 টি সার্ভারে ডেটা প্রতিলিপি করে সুরক্ষা বজায় রাখে। এর অর্থ আপনার লেখকরা কোনও ডিস্ক সিঙ্কের জন্য অপেক্ষা করবেন না, তবে ফিরে আসার আগে নেটওয়ার্কের প্রতিরূপের জন্য। ত্রুটির জন্য অপেক্ষা না করা এমন কিছু যা কখনও কখনও করা হয় না। নেটওয়ার্কে লেখার সময় নেটওয়ার্ক কেবলটি সংযুক্ত কিনা তা সনাক্ত না করা।
সিভান

18

রেডিস এবং মঙ্গোডিবি সন্নিবেশ কর্ম সম্পাদনের বিশ্লেষণ সম্পর্কে দয়া করে এই পোস্টটি দেখুন :

রেডিস আরপুশের তুলনায় 5000 এন্ট্রি পর্যন্ত মঙ্গডব $ পুশ দ্রুত হয় তবে এটি অবিশ্বাস্যরূপে ধীর হয়ে যায়, সম্ভবত মঙ্গোদব অ্যারে টাইপের লিনিয়ার সন্নিবেশ সময় রয়েছে এবং তাই এটি ধীর এবং ধীর হয়ে যায়। ধ্রুবক সময় সন্নিবেশ তালিকার প্রকারটি প্রকাশ করে মংডোব কিছুটা পারফরম্যান্স অর্জন করতে পারে তবে লিনিয়ার টাইম অ্যারে টাইপ (যা ধ্রুবক সময় সন্ধানের গ্যারান্টি দিতে পারে) এর সাথে এটির ছোট ছোট ডেটার জন্য অ্যাপ্লিকেশন রয়েছে।


15

ভাল এবং সাধারণ মানদণ্ড

আমি রেডিসের বর্তমান সংস্করণগুলি (২.6.১ 2.) এবং মঙ্গো (২.৪.৮) ব্যবহার করে আবার ফলাফলগুলি পুনরায় গণনা করার চেষ্টা করেছি এবং ফলাফল এখানে

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

এছাড়াও এই ব্লগ পোস্টটি উভয়ের সাথে তুলনা করে তবে নোড.জেএস ব্যবহার করে ares এটি সময়ের সাথে সাথে ডেটাবেজে ক্রমবর্ধমান এন্ট্রিগুলির প্রভাব দেখায়।


8

দু'জন একসাথে একই জায়গায় না থাকায় নম্বরগুলি খুঁজে পাওয়া শক্ত হতে চলেছে। সাধারণ উত্তরটি হ'ল রেডিস 10 - 30% দ্রুত যখন ডেটা সেটটি কোনও একক মেশিনের কাজের মেমরির মধ্যে ফিট করে। তথ্যটির পরিমাণ একবারে ছাড়িয়ে গেলে, রেডিস ব্যর্থ হয়। মঙ্গো এমন পরিমাণে ধীরে ধীরে ধীরে ধীরে নামবে যা বোঝার ধরণের উপর নির্ভর করে। কেবলমাত্র এক ধরণের লোডের জন্য একজন ব্যবহারকারী সম্প্রতি orders থেকে orders প্রস্থের (10,000 থেকে 100,000 বার) অর্ডার কমিয়ে রিপোর্ট করেছেন তবে সেই প্রতিবেদনেও স্বীকৃতি দেওয়া হয়েছে যে এখানে কনফিগারেশন সমস্যা ছিল এবং এটি একটি খুব অল্পিক কর্মক্ষম বোঝা ছিল। সাধারনত ভারী ভারী ভারী চাপগুলি প্রায় 10 এক্স দ্বারা ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পড়ে যায়।

উপসংহার: রেডিস দ্রুততর হবে তবে পুরোটা দ্বারা নয়।


7

টর্নেডো ফ্রেমওয়ার্কে প্রায় 1 বছর বয়সী সেশন পারফরম্যান্স সম্পর্কে একটি চমৎকার নিবন্ধ এখানে । এটি কয়েকটি পৃথক বাস্তবায়নের মধ্যে একটি তুলনা করে যার মধ্যে রেডিস এবং মঙ্গোডিবি অন্তর্ভুক্ত রয়েছে। নিবন্ধের গ্রাফটিতে বলা হয়েছে যে এই নির্দিষ্ট ব্যবহারের ক্ষেত্রে রেডিস প্রায় 10% মঙ্গোডিবির পিছনে রয়েছে।

রেডিস একটি বিল্ট ইন বেঞ্চমার্ক নিয়ে আসে যা আপনি যে যন্ত্রটি চালিয়ে যাচ্ছেন তার কার্যকারিতা বিশ্লেষণ করবে। রেডিসের বেনমার্ক উইকিতে এটি থেকে এক টন কাঁচা তথ্য রয়েছে । তবে আপনাকে মঙ্গোর জন্য কিছুটা সন্ধান করতে হবে। এখানে , এখানে এবং কিছু এলোমেলো পোলিশ নম্বরগুলি (তবে এটি আপনাকে কিছু মঙ্গোডিবি বেঞ্চমার্ক নিজে চালানোর জন্য একটি সূচনা পয়েন্ট দেয়) Like

আমি বিশ্বাস করি যে সমস্যাগুলির সর্বোত্তম সমাধান হ'ল আপনি যে ধরণের পরিস্থিতিতে প্রত্যাশা করছেন সেগুলি পরীক্ষা করে নিন।


টর্নেডো বেঞ্চমার্কগুলি রেডিস এবং মঙ্গোডিবিকে জেনড_ ক্যাশে ব্যাকএন্ড হিসাবে ব্যবহার করার ক্ষেত্রে আমার নিজের পরীক্ষাগুলির সাথে ভালভাবে সারিবদ্ধ হয়েছে। মঙ্গোডিবি-র সমৃদ্ধ কার্যকারিতা আপনাকে একক রেডিস প্রসেসের তুলনায় কম অনুরোধগুলি এবং মাল্টি-থ্রেডড ডিজাইনের স্কেলগুলি আরও ভালভাবে ব্যবহার করতে দেয় যা মাল্টি থ্রেডেড নয়। উপসংহারটি হ'ল মঙ্গোডিবি উচ্চতর স্কেল করে। এছাড়াও, রেডিস আর ভার্চুয়াল মেমরি সমর্থন করে না।
কলিনম

3

আমার ক্ষেত্রে, পারফরম্যান্স তুলনা করার ক্ষেত্রে যা নির্ধারক কারণ হয়ে দাঁড়িয়েছে, তা হ'ল মঙ্গোডিবি রাইটিং কনসার্ন that সর্বাধিক মোঙ্গো ড্রাইভার আজকাল স্বীকৃত যা মানে 'র্যাম লেখা' (ডিফল্ট WriteConcern সেট হবে Mongo2.6.3-WriteConcern ), এই ক্ষেত্রে, এটি বেশিরভাগ লেখার ক্রিয়াকলাপের জন্য পুনরায় তুলনামূলক ছিল।

তবে বাস্তবতা আপনার অ্যাপ্লিকেশন প্রয়োজনীয়তা এবং উত্পাদন পরিবেশের সেটআপের উপর নির্ভর করে আপনি এই উদ্বেগটি WritConcern.JOurnALED (ওপলগের কাছে লিখিত) বা WritConcern.FSYNCED (ডিস্কে লিখিত) অথবা এমনকি প্রতিলিপি সেটগুলিতে লিখিত (ব্যাক-আপস) এ পরিবর্তন করতে পারেন may যদি এটি প্রয়োজন হয়।

তারপরে আপনি কিছু কর্মক্ষমতা হ্রাস শুরু করতে পারেন। অন্যান্য গুরুত্বপূর্ণ বিষয়গুলির মধ্যে রয়েছে, আপনার ডেটা অ্যাক্সেসের ধরণগুলি কীভাবে অনুকূলিত করা হয়, সূচক মিস% ( মঙ্গোস্ট্যাট দেখুন ) এবং সাধারণভাবে সূচকগুলি অন্তর্ভুক্ত করে।


0

আমি মনে করি যে দেখানো বেঞ্চমার্কের ২-৩ এক্স বিভ্রান্তিমূলক, কারণ আপনি যদি এটি চালনা করেন এমন হার্ডওয়ারের উপরও নির্ভর করে - আমার অভিজ্ঞতা থেকে, 'শক্তিশালী' মেশিনটি, ব্যবধানটি তত বেশি (রেডিসের পক্ষে) হতে পারে, সম্ভবত বেঞ্চমার্ক মেমরি সীমাটি বেশ দ্রুত গতিতে আঘাত করে।

মেমোরির ক্ষমতা হিসাবে - এটি আংশিক সত্য, যেহেতু আরও ঘুরে দেখার উপায় রয়েছে, এমন কিছু (বাণিজ্যিক) পণ্য রয়েছে যা রেডিসের ডেটা ডিস্কে আবার লিখে দেয় এবং ক্লাস্টার (মাল্টি-শারার্ড) সমাধানগুলি যা মেমরির আকারকে অতিক্রম করে সীমাবদ্ধতা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.