Redis比mongoDB快多少?

Redis比mongoDB快多少?,mongodb,benchmarking,redis,Mongodb,Benchmarking,Redis,人们普遍提到,Redis“非常快”,mongoDB也非常快。但是,我很难找到比较两者结果的实际数字。给定类似的配置、功能和操作(可能会显示因子如何随不同的配置和操作而变化)等,Redis是否会快10倍、快2倍、快5倍 我只是说表演。我知道mongoDB是一种不同的工具,具有更丰富的功能集。这不是“mongoDB比Redis好吗”的争论。我在问,Redis的表现比mongoDB好多少 在这一点上,即使是便宜的基准也比没有基准要好。请查看Redis和MongoDB插入性能分析: 多达5000个条目m

人们普遍提到,Redis“非常快”,mongoDB也非常快。但是,我很难找到比较两者结果的实际数字。给定类似的配置、功能和操作(可能会显示因子如何随不同的配置和操作而变化)等,Redis是否会快10倍、快2倍、快5倍

我只是说表演。我知道mongoDB是一种不同的工具,具有更丰富的功能集。这不是“mongoDB比Redis好吗”的争论。我在问,Redis的表现比mongoDB好多少

在这一点上,即使是便宜的基准也比没有基准要好。

请查看Redis和MongoDB插入性能分析:

多达5000个条目mongodb$push甚至比Redis RPUSH更快,然后变得难以置信的慢,可能mongodb数组类型具有线性插入时间,因此它变得越来越慢。mongodb可能会通过公开固定时间插入列表类型获得一些性能,但即使使用线性时间数组类型(可以保证固定时间查找),它也可以应用于小数据集


数字将很难找到,因为两者并不完全在同一个空间。一般的答案是,当数据集放在一台机器的工作内存中时,Redis的速度会提高10-30%。一旦超过该数据量,Redis就会失败。Mongo的减速量取决于负载类型。对于仅插入的负载类型,一位用户最近报告了6到7个数量级(10000到100000次)的减速,但该报告也承认存在配置问题,这是一种非常非典型的工作负载。当一些数据必须从磁盘上读取时,正常的读取重负载速度大约慢10倍


结论:Redis会更快,但不会太快。

这是一篇关于1年前龙卷风框架的优秀文章。它比较了几种不同的实现,包括Redis和MongoDB。文章中的图表表明,在这个特定的用例中,Redis比MongoDB落后约10%

Redis附带了一个内置的基准测试,可以分析您所在机器的性能。在Redis的网站上有大量的原始数据。但你可能得四处看看Mongo。例如,和一些随机的(但它为您自己运行一些MongoDB基准测试提供了一个起点)


我认为解决这个问题的最好办法是在你期望的情况下自己进行测试。

以下基准测试的大致结果: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

当然,对结果不屑一顾!如果您使用另一种语言编程,使用其他客户机/不同的实现等,那么您的结果将大相径庭。更不用说你的用法会完全不同!你最好的办法是自己对它们进行基准测试,精确地按照你打算使用它们的方式。作为推论,您可能会找到利用每种方法的最佳方法。永远为自己标杆

良好且简单的基准

我尝试使用当前版本的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。它显示了随着时间的推移数据库中条目数量不断增加的效果。

在我的例子中,性能比较中的一个决定因素是使用的MongoDb WriteConcern。现在大多数mongo驱动程序都会将默认WriteConcern设置为“已确认”,这意味着“已写入RAM”(),在这方面,对于大多数写入操作来说,它与redis非常相似

但实际情况取决于您的应用程序需要和生产环境设置,如果需要,您可能希望将此问题更改为WriteConcern.JOURNALED(写入oplog)或WriteConcern.FSYNCED(写入磁盘),甚至写入副本集(备份)


然后,您可能会看到一些性能下降。其他重要因素还包括,数据访问模式的优化程度、索引未命中率%(请参阅)和总体索引。

我认为所示基准上的2-3倍是误导性的,因为如果还取决于运行它的硬件,根据我的经验,机器越“强大”,差距就越大(有利于Redis)将, 可能是因为基准测试很快就达到了内存限制


至于内存容量——这部分是正确的,因为也有办法解决这个问题,有(商业)产品将Redis数据写回磁盘,还有克服内存大小限制的群集(多分片)解决方案。

值得一提的是,MongoDB和Redis具有不同的持久性结构,而且Redis只支持一个能够放入内存的数据模式。虽然ram很便宜,但如果你需要使用/存储超过12-16GB的数据,我会看看你的服务器选项是什么样子。@sivann这篇文章从没有基准测试到明确的“粗略”基准测试。不要成为一个“基准是误导性的”胡说八道的巨魔。当然,不同的条件会改变结果。返回并提交您自己的测试案例的基准测试,并从本文链接,然后我们都将受益于您的“测试”意见。@sivann默认(附带)配置就是此基准测试的内容。IMHO,默认配置确定包位于fsync围栏的哪一侧。对于Redis,它被宣传为一个内存服务器,鼓励人们使用其他altern