mongodbbenchmarkingredis

How much faster is Redis than mongoDB?


It's widely mentioned that Redis is "Blazing Fast" and mongoDB is fast too. But, I'm having trouble finding actual numbers comparing the results of the two. Given similar configurations, features and operations (and maybe showing how the factor changes with different configurations and operations), etc, is Redis 10x faster?, 2x faster?, 5x faster?

I'm ONLY speaking of performance. I understand that mongoDB is a different tool and has a richer feature set. This is not the "Is mongoDB better than Redis" debate. I'm asking, by what margin does Redis outperform mongoDB?

At this point, even cheap benchmarks are better than no benchmarks.


Solution

  • Rough results from the following benchmark: 2x write, 3x read.

    Here's a simple benchmark in python you can adapt to your purposes, I was looking at how well each would perform simply setting/retrieving values:

    #!/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)
    

    Results for with mongodb 1.8.1 and redis 2.2.5 and latest 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
    

    Take the results with a grain of salt of course! If you are programming in another language, using other clients/different implementations, etc your results will vary wildy. Not to mention your usage will be completely different! Your best bet is to benchmark them yourself, in precisely the manner you are intending to use them. As a corollary you'll probably figure out the best way to make use of each. Always benchmark for yourself!