众所周知,Redis的速度“极快”,mongoDB的速度也很快。但是,我很难找到比较两者结果的实际数字。给出类似的配置、功能和操作(可能会显示不同的配置和操作如何改变因子)等,Redis是否快了10倍?,快2倍?,快5倍?

我只是在说性能。我知道mongoDB是一个不同的工具,有更丰富的特性集。这不是“mongoDB比Redis好吗”的争论。我的问题是,Redis的表现比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和MongoDB插入性能分析的文章:

高达5000个条目的mongodb $push甚至比Redis RPUSH更快,然后它变得非常慢,可能mongodb数组类型有线性插入时间,所以它变得越来越慢。Mongodb可能通过公开常量时间插入列表类型获得一些性能,但即使使用线性时间数组类型(可以保证常量时间查找),它也有用于小数据集的应用程序。

Numbers are going to be hard to find as the two are not quite in the same space. The general answer is that Redis 10 - 30% faster when the data set fits within working memory of a single machine. Once that amount of data is exceeded, Redis fails. Mongo will slow down at an amount which depends on the type of load. For an insert only type of load one user recently reported a slowdown of 6 to 7 orders of magnitude (10,000 to 100,000 times) but that report also admitted that there were configuration issues, and that this was a very atypical working load. Normal read heavy loads anecdotally slow by about 10X when some of the data must be read from disk.

结论:Redis会更快,但不会快很多。

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

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

这里有一篇关于Tornado框架中会话性能的优秀文章,大约有1年的历史。它有几个不同的实现之间的比较,其中包括Redis和MongoDB。文章中的图表表明,在这个特定的用例中,Redis落后于MongoDB大约10%。

Redis内置了一个基准测试,可以分析你所在机器的性能。在Redis的Benchmark维基上有大量的原始数据。但是你可能需要四处看看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

当然要对结果持保留态度!如果你用另一种语言编程,使用其他客户端/不同的实现,等等,你的结果会有很大的不同。更不用说你的用法会完全不同!最好的办法是自己以您打算使用它们的方式对它们进行基准测试。作为推论,你可能会找出利用每一个的最佳方法。永远以自己为基准!