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

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

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

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

7 ответов


грубые результаты от следующего бенчмарка:2 раза писал, 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)

результаты по запросу with mongodb 1.8.1 and redis 2.2.5 and latest 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

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


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

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


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

Я попытался пересчитать результаты снова, используя текущие версии 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. Он показывает эффект увеличения количества записей в базе данных вместе со временем.


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

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


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

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

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


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

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

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


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

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