Насколько быстрее Redis, чем mongoDB? - PullRequest
195 голосов
/ 10 марта 2011

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

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

На этом этапе даже дешевые тесты лучше, чем никаких тестов.

Ответы [ 7 ]

228 голосов
/ 03 мая 2011

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

Вот простой тест на 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

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

17 голосов
/ 10 марта 2011

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

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

15 голосов
/ 20 ноября 2013

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

Я снова попытался пересчитать результаты, используя текущие версии 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 голосов
/ 03 мая 2011

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

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

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

7 голосов
/ 11 марта 2011

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

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

3 голосов
/ 01 августа 2014

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

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

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

0 голосов
/ 28 декабря 2017

Я думаю, что 2-3X на показанном тесте вводят в заблуждение, поскольку, если вы также зависите от аппаратного обеспечения, на котором вы его используете - по моему опыту, чем «сильнее» машина, тем больше разрыв (в пользу Redis) будет, вероятно, из-за того, что тестирование довольно быстро достигает предела памяти.

Что касается объема памяти - это отчасти верно, так как есть и способы обойти это, есть (коммерческие) продукты, которые записывают данные Redis на диск, а также кластерные (многозадачные) решения, которые преодолевают ограничение размера памяти.

...