Redis比mongoDB快了多less?

人们普遍提到Redis是“快速”,mongoDB也是快速的。 但是,我很难find比较两者结果的实际数字。 给定类似的configuration,function和操作(也许可以说明不同configuration和操作的因素如何变化)等等,Redis的速度快了10倍,速度提高了2倍,速度提高了5倍。

我只是在谈论performance。 我明白,mongoDB是一个不同的工具,并具有更丰富的function集。 这不是“mongoDB比Redis 更好 ”的辩论。 我问,Redis的性能优于mongoDB吗?

在这一点上,即使是廉价的基准比没有基准要好。

以下基准testing结果粗略: 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) 

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 

当然,拿一粒盐的结果! 如果你用另一种语言编程,使用其他客户端/不同的实现等等,你的结果将会变化很多。 更何况你的使用将是完全不同的! 你最好的select就是自己对照它们,就像你打算使用它们一样。 作为一个推论,你可能会找出最好的方法来利用每个。 永远为自己的标杆!

请查看关于Redis和MongoDB插入性能分析的文章:

多达5000个条目mongodb $ push与Redis RPUSH相比速度更快,然后变得非常慢,可能是mongodb数组types具有线性插入时间,所以它变得越来越慢。 mongodb可能会通过暴露一个恒定的时间插入列表types来获得一些性能,但即使使用线性时间数组types(这可以保证恒定的时间查找),它也可以用于小数据集。

好的和简单的基准

我试着重新计算结果再次使用当前版本的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。 它显示随着时间的增加数据库中的条目数量的影响。

数字将很难find,因为两者不在相同的空间。 一般的答案是,当数据集合在单个机器的工作存储器中时,Redis速度提高了10 – 30%。 一旦超过这个数据量,Redis就会失败。 Mongo将会根据负载的types而减速。 对于仅插入一种types的负载,一个用户最近报告减慢了6到7个数量级(10,000到100,000次),但是该报告也承认存在configuration问题,并且这是一个非常非典型的工作负载。 当一些数据必须从磁盘读取时,正常读取重负载的速度会减慢约10倍。

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

这里有一篇关于1岁左右的Tornado框架中会话性能的优秀文章。 它比较了几个不同的实现,其中包括Redis和MongoDB。 文章中的图表指出,在这个特定的用例中,Redis在MongoDB背后约10%。

Redis提供了一个内置的基准testing程序,可以分析您所在机器的性能。 Redis的Benchmark wiki上有大量的原始数据。 但是你可能不得不为蒙古考虑一下。 就像这里 , 在这里 ,还有一些随机的波兰数字 (但它给你自己运行一些MongoDB基准的起点)。

我相信这个问题的最佳解决scheme是在你所期望的情况下自己进行testing。

就我而言,性能比较的决定性因素是使用的MongoDb WriteConcern。 现在大多数mongo驱动程序将默认WriteConcern设置为ACKNOWLEDGED,意思是“写入RAM”( Mongo2.6.3-WriteConcern ),就这一点而言,对于大多数写入操作来说,它与redis非常相似。

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

那么你可能会开始看到一些性能下降。 其他重要因素还包括:数据访问模式的优化程度如何,索引错误百分比(请参见mongostat )和索引。