众所周知,Redis的速度“极快”,mongoDB的速度也很快。但是,我很难找到比较两者结果的实际数字。给出类似的配置、功能和操作(可能会显示不同的配置和操作如何改变因子)等,Redis是否快了10倍?,快2倍?,快5倍?
我只是在说性能。我知道mongoDB是一个不同的工具,有更丰富的特性集。这不是“mongoDB比Redis好吗”的争论。我的问题是,Redis的表现比mongoDB好多少?
在这一点上,即使是廉价的基准也比没有基准要好。
众所周知,Redis的速度“极快”,mongoDB的速度也很快。但是,我很难找到比较两者结果的实际数字。给出类似的配置、功能和操作(可能会显示不同的配置和操作如何改变因子)等,Redis是否快了10倍?,快2倍?,快5倍?
我只是在说性能。我知道mongoDB是一个不同的工具,有更丰富的特性集。这不是“mongoDB比Redis好吗”的争论。我的问题是,Redis的表现比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和MongoDB插入性能分析的文章:
高达5000个条目的mongodb $push甚至比Redis RPUSH更快,然后它变得非常慢,可能mongodb数组类型有线性插入时间,所以它变得越来越慢。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。它显示了数据库中条目数量随时间增加的影响。
在我的例子中,性能比较的决定因素是所使用的MongoDb WriteConcern。现在大多数mongo驱动都会将默认的WriteConcern设置为“已确认”,这意味着“写入到RAM”(Mongo2.6.3-WriteConcern),在这方面,对于大多数写操作来说,它与redis非常相似。
但实际情况取决于您的应用程序需求和生产环境设置,您可能希望将此关注点更改为WriteConcern。JOURNALED(写入到oplog)或WriteConcern。FSYNCED(写入磁盘),如果需要,甚至可以写入副本集(备份)。
然后您可能会看到性能有所下降。其他重要的因素还包括数据访问模式的优化程度、索引遗漏率(参见mongostat)和一般索引。
以下基准测试的粗略结果: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基准测试提供了一个起点)。
我相信这个问题的最佳解决方案是在您所期望的情况类型中自己执行测试。