众所周知,Redis的速度“极快”,mongoDB的速度也很快。但是,我很难找到比较两者结果的实际数字。给出类似的配置、功能和操作(可能会显示不同的配置和操作如何改变因子)等,Redis是否快了10倍?,快2倍?,快5倍?
我只是在说性能。我知道mongoDB是一个不同的工具,有更丰富的特性集。这不是“mongoDB比Redis好吗”的争论。我的问题是,Redis的表现比mongoDB好多少?
在这一点上,即使是廉价的基准也比没有基准要好。
众所周知,Redis的速度“极快”,mongoDB的速度也很快。但是,我很难找到比较两者结果的实际数字。给出类似的配置、功能和操作(可能会显示不同的配置和操作如何改变因子)等,Redis是否快了10倍?,快2倍?,快5倍?
我只是在说性能。我知道mongoDB是一个不同的工具,有更丰富的特性集。这不是“mongoDB比Redis好吗”的争论。我的问题是,Redis的表现比mongoDB好多少?
在这一点上,即使是廉价的基准也比没有基准要好。
当前回答
这里有一篇关于Tornado框架中会话性能的优秀文章,大约有1年的历史。它有几个不同的实现之间的比较,其中包括Redis和MongoDB。文章中的图表表明,在这个特定的用例中,Redis落后于MongoDB大约10%。
Redis内置了一个基准测试,可以分析你所在机器的性能。在Redis的Benchmark维基上有大量的原始数据。但是你可能需要四处看看Mongo。比如这里、这里和一些随机的优化数字(但它为您自己运行一些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会更快,但不会快很多。
在我的例子中,性能比较的决定因素是所使用的MongoDb WriteConcern。现在大多数mongo驱动都会将默认的WriteConcern设置为“已确认”,这意味着“写入到RAM”(Mongo2.6.3-WriteConcern),在这方面,对于大多数写操作来说,它与redis非常相似。
但实际情况取决于您的应用程序需求和生产环境设置,您可能希望将此关注点更改为WriteConcern。JOURNALED(写入到oplog)或WriteConcern。FSYNCED(写入磁盘),如果需要,甚至可以写入副本集(备份)。
然后您可能会看到性能有所下降。其他重要的因素还包括数据访问模式的优化程度、索引遗漏率(参见mongostat)和一般索引。
我认为所示基准上的2-3X是误导性的,因为如果你也取决于你运行它的硬件-从我的经验来看,机器越“强大”,差距就越大(有利于Redis), 可能是因为基准测试很快就达到了内存限制。
至于内存容量——这部分是正确的,因为也有办法解决这个问题,有(商业)产品将Redis数据写回磁盘,也有集群(多分片)解决方案克服内存大小限制。
以下基准测试的粗略结果: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
当然要对结果持保留态度!如果你用另一种语言编程,使用其他客户端/不同的实现,等等,你的结果会有很大的不同。更不用说你的用法会完全不同!最好的办法是自己以您打算使用它们的方式对它们进行基准测试。作为推论,你可能会找出利用每一个的最佳方法。永远以自己为基准!
这里有一篇关于Tornado框架中会话性能的优秀文章,大约有1年的历史。它有几个不同的实现之间的比较,其中包括Redis和MongoDB。文章中的图表表明,在这个特定的用例中,Redis落后于MongoDB大约10%。
Redis内置了一个基准测试,可以分析你所在机器的性能。在Redis的Benchmark维基上有大量的原始数据。但是你可能需要四处看看Mongo。比如这里、这里和一些随机的优化数字(但它为您自己运行一些MongoDB基准测试提供了一个起点)。
我相信这个问题的最佳解决方案是在您所期望的情况类型中自己执行测试。