¿Cuánto más rápido es Redis que MongoDB?


Se ha mencionado ampliamente que Redis es "increíblemente rápido" y MongoDB también es rápido. Pero, estoy teniendo problemas para encontrar números reales comparando los resultados de los dos. Dadas configuraciones, características y operaciones similares (y tal vez mostrando cómo cambia el factor con diferentes configuraciones y operaciones), etc., ¿Redis es 10 veces más rápido?, 2x más rápido?, 5 veces más rápido?

SÓLO estoy hablando de rendimiento. Entiendo que MongoDB es una herramienta diferente y tiene un conjunto de características más rico. Este no es el "Es MongoDB mejor que Redis" debate. Estoy preguntando, ¿por qué margen Redis supera a MongoDB?

En este punto, incluso los benchmarks baratos son mejores que ningún benchmarks.

Author: Chris Seymour, 2011-03-10

7 answers

Resultados aproximados del siguiente benchmark: 2x write, 3x read.

Aquí hay un punto de referencia simple en python que puede adaptar a sus propósitos, estaba mirando lo bien que cada uno se desempeñaría simplemente configurando / recuperando valores:

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

Resultados para mongodb 1.8.1 y redis 2.2.5 y las últimas 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

Tome los resultados con un grano de sal, por supuesto! Si está programando en otro lenguaje, utilizando otros clientes / diferentes implementaciones, etc su los resultados variarán wildy. Sin mencionar que su uso será completamente diferente! Su mejor apuesta es compararlos usted mismo, precisamente de la manera en que tiene la intención de usarlos. Como corolario, probablemente descubrirás la mejor manera de hacer uso de cada uno. Siempre benchmark para ti mismo!

 223
Author: zeekay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-03 22:41:06

Por favor revise este post sobre el análisis de rendimiento de inserción de Redis y MongoDB:

Hasta 5000 entradas mongodb push push es más rápido incluso en comparación con Redis RPUSH, entonces se vuelve increíblemente lento, probablemente el tipo de matriz mongodb tiene tiempo de inserción lineal y por lo tanto se vuelve más y más lento. mongodb podría obtener un poco de rendimiento al exponer un tipo de lista de inserción de tiempo constante, pero incluso con el tipo de matriz de tiempo lineal (que puede garantizar una búsqueda de tiempo constante) tiene sus aplicaciones para pequeños conjuntos de datos.

 15
Author: Andrei Andrushkevich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-03 04:55:53

Punto de referencia bueno y simple

Traté de volver a calcular los resultados utilizando las versiones actuales de redis(2.6.16) y mongo (2.4.8) y aquí está el resultado

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

También esta entrada de blog compara ambos pero usando node.js. Muestra el efecto de aumentar el número de entradas en la base de datos junto con el tiempo.

 14
Author: Tareq Salaheldeen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-20 09:06:32

Los números van a ser difíciles de encontrar ya que los dos no están en el mismo espacio. La respuesta general es que Redis 10-30% más rápido cuando el conjunto de datos se ajusta a la memoria de trabajo de una sola máquina. Una vez que se supera esa cantidad de datos, Redis falla. Mongo disminuirá la velocidad en una cantidad que depende del tipo de carga. Para un tipo de carga de inserción única, un usuario informó recientemente una desaceleración de 6 a 7 órdenes de magnitud (10,000 a 100,000 veces), pero ese informe también admitió que había problemas de configuración, y que esta era una carga de trabajo muy atípica. Normal leer cargas pesadas anecdóticamente lento por alrededor de 10X cuando algunos de los datos deben ser leídos desde el disco.

Conclusión: Redis será más rápido pero no mucho.

 7
Author: John F. Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-03 00:48:58

Aquí hay un excelente artículo sobre el rendimiento de la sesión en el marco de Tornado de aproximadamente 1 año de edad. Tiene una comparación entre algunas implementaciones diferentes, de las cuales se incluyen Redis y MongoDB. El gráfico del artículo indica que Redis está detrás de MongoDB en aproximadamente un 10% en este caso de uso específico.

Redis viene con un punto de referencia integrado que analizará el rendimiento de la máquina en la que se encuentre. Hay un montón de datos sin procesar en el wiki de Benchmark para Redis. Pero tal vez tengas que buscar un poco a Mongo. Como aquí, aquí , y algunos números polacos aleatorios (pero le da un punto de partida para ejecutar algunos puntos de referencia MongoDB usted mismo).

Creo que la mejor solución a este problema es realizar las pruebas usted mismo en el tipo de situaciones que usted espera.

 7
Author: mistagrooves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-20 07:30:53

En mi caso, lo que ha sido un factor determinante en la comparación de rendimiento, es la preocupación de escritura MongoDB que se utiliza. La mayoría de los controladores de mongo hoy en día establecen el WriteConcern predeterminado a ACKNOWLEDGED que significa 'escrito en RAM' (Mongo2.6.3-WriteConcern), en ese sentido, era muy comparable a redis para la mayoría de las operaciones de escritura.

Pero la realidad depende de las necesidades de su aplicación y la configuración del entorno de producción, es posible que desee cambiar esta preocupación a Escribe la preocupación.DIARIO (escrito a oplog) o WriteConcern.FSYNCED (escrito en disco) o incluso escrito en conjuntos de réplicas (copias de seguridad) si es necesario.

Entonces usted puede comenzar a ver cierta disminución de rendimiento. Otros factores importantes también incluyen la optimización de los patrones de acceso a los datos, el índice miss % (ver mongostat) y los índices en general.

 3
Author: schwarz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-01 17:03:42

Creo que los 2-3X en el benchmark mostrado son engañosos, ya que si también depende del hardware en el que lo ejecute, según mi experiencia, cuanto más 'fuerte' sea la máquina, más grande será la brecha (a favor de Redis) , probablemente por el hecho de que el benchmark alcanza el límite de memoria bastante rápido.

En cuanto a la capacidad de memoria - esto es parcialmente cierto, ya que también hay formas de ir alrededor de eso, hay productos (comerciales) que escribe de nuevo los datos de Redis en el disco, y también soluciones de clúster (multi-sharded) que superan la limitación de tamaño de memoria.

 0
Author: Elior Malul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-28 07:14:35