Redis比mongoDB快多少?

时间:2011-03-09 21:46:21

标签: mongodb benchmarking redis

人们普遍提到Redis是“Blazing Fast”,mongoDB也很快。但是,我很难找到比较两者结果的实际数字。鉴于类似的配置,功能和操作(并且可能显示因子如何随着不同的配置和操作而变化)等,Redis 10x更快?,快2倍,快5倍?

我只谈论表现。据我所知,mongoDB是一个不同的工具,具有更丰富的功能集。这不是“mongoDB 比Redis更好”的辩论。我问,Redis在多大程度上优于mongoDB?

此时,即使是便宜的基准也比没有基准更好。

7 个答案:

答案 0 :(得分:228)

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

当然,用一粒盐取结果!如果您使用其他语言编程,使用其他客户端/不同的实现等,您的结果将会变化很大。更不用说你的用法将完全不同!您最好的选择是以您打算使用它们的方式自己进行基准测试。作为推论,您可能会找出最佳方式来利用每个方法。永远都是自己的基准!

答案 1 :(得分:17)

请检查this post有关Redis和MongoDB插入性能分析的信息:

  

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

答案 2 :(得分:15)

良好而简单的基准

我尝试使用当前版本的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

blog post同时使用node.js比较它们。它显示了数据库中条目数量随时间增加的影响。

答案 3 :(得分:7)

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

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

答案 4 :(得分:7)

以下是关于1岁儿童的龙卷风框架中session performance的优秀文章。它对几个不同的实现进行了比较,其中包括Redis和MongoDB。文章中的图表表明,在这个特定的用例中,Redis在MongoDB上的支持率约为10%。

Redis附带内置基准测试,可分析您所使用机器的性能。 Redis的Benchmark wiki有大量的原始数据。但你可能不得不为Mongo看一下。与herehere和一些随机polish numbers类似(但它为您提供了自己运行MongoDB基准测试的起点)。

我相信这个问题的最佳解决方案是在你期望的各种情况下自己进行测试。

答案 5 :(得分:3)

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

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

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

答案 6 :(得分:0)

我认为所显示的基准测试中的2-3X是误导性的,因为如果你还依赖于你运行它的硬件 - 根据我的经验,机器越“强”,差距越大(赞成of Redis)将是, 可能是因为基准测试非常快地达到了内存限制。

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

相关问题