Насколько быстрее Redis, чем mongoDB?

179

Он широко упомянул, что Redis - "Blazing Fast", а mongoDB - тоже быстро. Но у меня возникают проблемы с поиском реальных чисел, сравнивающих результаты этих двух. Учитывая аналогичные конфигурации, функции и операции (и, возможно, показывая, как изменяется фактор с различными конфигурациями и операциями) и т.д., Redis 10x быстрее?, 2x быстрее?, в 5 раз быстрее?

Я ТОЛЬКО говорю о производительности. Я понимаю, что mongoDB - это другой инструмент и имеет более богатый набор функций. Это не дискуссия "Is mongoDB лучше, чем Redis". Я спрашиваю, на какой марже Redis превосходит mongoDB?

На данный момент даже дешевые тесты лучше, чем нет.

  • 9
    Дешевые тесты всегда лучше, чем отсутствие тестов. Спасибо за вопрос, приятель.
  • 2
    В общем, забота о разнице между 5000 операций в секунду и 10000 операций в секунду часто является случаем преждевременной оптимизации. Тем не менее, это все еще интересный ответ :)
Теги:
redis
benchmarking

6 ответов

227
Лучший ответ

Грубые результаты из следующего теста: 2x писать, читать 3 раза.

Здесь простой тест на python, который вы можете адаптировать к своим целям, я смотрел, насколько хорошо каждый будет выполнять просто настройку/получение значений:

#!/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)

Результаты для mongodb 1.8.1 и redis 2.2.5 и последние pymongo/redis-py:

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

Конечно, возьмите результаты с солью! Если вы программируете на другом языке, используя других клиентов/различные реализации и т.д., Ваши результаты будут различными. Не говоря уже о том, что ваше использование будет совершенно другим! Лучше всего сравнить их сами, точно так, как вы собираетесь их использовать. В качестве следствия вы, вероятно, найдете лучший способ использовать каждый из них. Всегда проверяйте себя!

  • 0
    Большое спасибо ... это дает мне приблизительный ответ, который я искал ... 2x напишите, 3x прочитайте ... идеально ... конечно, для конкретных проблем, это будет отличаться, но это грубый оценить ... тывм
  • 3
    Стоит отметить, что MongoDB и Redis имеют разные структуры персистентности, и что Redis поддерживает только схему данных, которая может помещаться в памяти. Хотя оперативная память обходится дешево, если вам нужно использовать / хранить более 12-16 ГБ данных, я бы посмотрел, как выглядят параметры вашего сервера.
Показать ещё 9 комментариев
15

Пожалуйста, проверьте этот пост относительно анализа эффективности вложений Redis и MongoDB:

До 5000 записей mongodb $push быстрее даже по сравнению с Redis RPUSH, тогда он становится невероятно медленным, вероятно, тип массива mongodb имеет линейное время вставки, и поэтому он становится медленнее и медленнее. mongodb может получить немного производительности, подвергая постоянному типу списка вставки времени, но даже с линейным типом массива времени (который может гарантировать постоянный поиск по времени) он имеет свои приложения для небольших наборов данных.

14

Хороший и простой тест

Я попытался снова пересчитать результаты, используя текущие версии redis (2.6.16) и mongo (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

Также этот пост в блоге сравнивает их оба, но использует node.js. Он показывает эффект увеличения количества записей в базе данных вместе со временем.

7

Вот отличная статья о производительности сеанса в системе Tornado около 1 года. Он имеет сравнение между несколькими различными реализациями, в которые включены Redis и MongoDB. График в статье гласит, что Redis находится за MongoDB примерно на 10% в этом конкретном случае использования.

Redis поставляется со встроенным эталоном, который будет анализировать производительность машины, на которой вы находитесь. Существует тонна необработанных данных из Benchmark wiki для Redis. Но вам, возможно, придется немного поглядеть на Монго. Например здесь, здесь, и некоторые случайные польский номер (но он дает вам отправную точку для запуска некоторых тестов MongoDB).

Я считаю, что лучшим решением этой проблемы является самотестирование тестов в ситуациях, которые вы ожидаете.

  • 0
    Тесты Tornado хорошо согласуются с моими собственными тестами по использованию Redis и MongoDb в качестве бэкэнда Zend_Cache. Более широкие функциональные возможности MongoDb позволяют использовать меньше запросов, а многопоточный дизайн масштабируется гораздо лучше, чем один процесс Redis, который не является многопоточным. Вывод: MongoDb масштабируется выше. Также Redis больше не поддерживает виртуальную память.
7

Номера будут трудно найти, поскольку они не совсем в одном и том же пространстве. Общий ответ: Redis 10-30% быстрее, когда набор данных подходит в рабочей памяти одной машины. Как только этот объем данных будет превышен, Redis завершится с ошибкой. Монго будет замедляться на величину, которая зависит от типа нагрузки. Для вставки только типа нагрузки один пользователь недавно сообщил о замедлении от 6 до 7 порядков (от 10000 до 100 000 раз), но этот отчет также признал, что были проблемы с конфигурацией, и что это была очень нетипичная рабочая нагрузка. Нормальные чтения тяжелых нагрузок анекдотически медленнее примерно на 10X, когда некоторые данные должны считываться с диска.

Вывод: Redis будет быстрее, но не целым.

3

В моем случае, что было определяющим фактором в сравнении производительности, используется MongoDb WriteConcern. Большинство драйверов mongo в настоящее время устанавливают значение WriteConcern по умолчанию для ACKNOWLEDGED, что означает "записывается в RAM" (Mongo2.6.3-WriteConcern) в этом отношении он был очень сопоставим с redis для большинства операций записи.

Но реальность зависит от потребностей вашего приложения и настройки производственной среды, вы можете изменить эту проблему на WriteConcern.JOURNALED(записано на oplog) или WriteConcern.FSYNCED(записано на диск) или даже записано в набор реплик (назад -ups), если это необходимо.

Затем вы можете увидеть некоторое снижение производительности. Другие важные факторы также включают в себя, как оптимизированы ваши шаблоны доступа к данным, пропустить индекс% (см. mongostat) и индексы в вообще.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню