web-dev-qa-db-ja.com

RedisはmongoDBよりどれくらい高速ですか?

Redisは「Blazing Fast」であり、mongoDBも高速であると広く言われています。しかし、2つの結果を比較して実際の数値を見つけるのは困難です。同様の構成、機能、および操作(および、異なる構成および操作で係数がどのように変化するかを示す)などが与えられた場合、Redisは10倍、2倍、5倍高速になりますか?

私はパフォーマンスについてのみ話します。 mongoDBは別のツールであり、より豊富な機能セットがあることを理解しています。これは「MongoDB better Redisよりも」という議論ではありません。 RedisはmongoDBよりもどの程度マージンが優れていますか?

この時点では、安価なベンチマークでもベンチマークなしよりも優れています。

195
Homer6

次のベンチマークの大まかな結果: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 __== '__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

もちろん、一粒の塩で結果を取ります!他のクライアント/異なる実装などを使用して別の言語でプログラミングしている場合、結果は大きく異なります。言うまでもなく、使用方法は完全に異なります!あなたが最善の策は、あなたがそれらを正確にあなたがそれらを使用するつもりである方法でベンチマークすることです。当然の結果として、おそらくそれぞれを利用するためのbestの方法を理解するでしょう。常に自分のベンチマークを行います!

228
zeekay

RedisおよびMongoDB挿入パフォーマンス分析について この投稿 を確認してください。

最大5000エントリのmongodb $ Pushは、Redis RPUSHと比較しても高速ですが、信じられないほど遅くなりました。おそらくmongodb配列タイプは線形挿入時間を持っているため、ゆっくりと遅くなります。 mongodbは、一定時間の挿入リストタイプを公開することでパフォーマンスを少し向上させる可能性がありますが、線形時間配列タイプ(一定時間のルックアップを保証できる)であっても、小さなデータセットに用途があります。

17

良いシンプルなベンチマーク

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を使用して両方を比較します。これは、データベース内のエントリ数が時間とともに増加する効果を示しています。

15
Tareq Salah

2つはまったく同じスペースにないため、数字を見つけるのは難しいでしょう。一般的な答えは、データセットが単一のマシンの作業メモリ内に収まる場合、Redis 10-30%高速であるということです。そのデータ量を超えると、Redisは失敗します。 Mongoは、負荷のタイプに応じた量で速度が低下します。挿入のみのタイプの負荷の場合、あるユーザーは最近、6から7桁(10,000から100,000倍)の速度低下を報告しましたが、その報告では、構成の問題があり、これが非常に典型的な作業負荷であることも認めました。一部のデータをディスクから読み取る必要がある場合、通常の読み取り負荷は逸話的に約10倍遅くなります。

結論: Redisは全体的にではなく高速になります。

7
John F. Miller

これは、約1歳のTornadoフレームワークの セッションパフォーマンス に関する優れた記事です。 RedisとMongoDBが含まれているいくつかの異なる実装間の比較があります。記事のグラフは、この特定のユースケースでは、RedisがMongoDBに約10%遅れていることを示しています。

Redisには、使用しているマシンのパフォーマンスを分析するベンチマークが組み込まれています。 Redisの Benchmark wiki には、そこから大量の生データがあります。しかし、Mongoを少し見回す必要があるかもしれません。 herehere 、およびいくつかのランダムな polish番号 のように(ただし、MongoDBベンチマークを自分で実行するための出発点となります)。

この問題に対する最善の解決策は、期待する種類の状況で自分でテストを実行することだと思います。

7
mistagrooves

私の場合、パフォーマンス比較の決定要因となったのは、使用されるMongoDb WriteConcernです。最近のほとんどのmongoドライバーは、デフォルトのWriteConcernをACKNOWLEDGEDに設定します。これは、「RAMへの書き込み」( Mongo2.6.3-WriteConcern )を意味します。

しかし、現実はアプリケーションのニーズと実稼働環境の設定に依存するため、この懸念をWriteConcern.JOURNALED(oplogに書き込まれる)またはWriteConcern.FSYNCED(ディスクに書き込まれる)、またはレプリカセット(バックアップ)に変更することもできます。必要な場合。

その後、パフォーマンスの低下が見られる場合があります。他の重要な要因には、データアクセスパターンの最適化方法、インデックスミス%( mongostat を参照)、およびインデックス一般も含まれます。

3
schwarz

表示されているベンチマークの2-3Xは、それを実行するハードウェアにも依存する場合、誤解を招くと思います-私の経験から、マシンが「強い」ほど、ギャップが大きくなります(Redisを支持します)おそらくベンチマークがメモリ境界の制限にかなり速く達するという事実によるでしょう。

メモリ容量については-これは部分的に真実です、それを回避する方法もあるので、Redisデータをディスクに書き戻す(商用)製品と、メモリサイズを克服するクラスター(マルチシャード)ソリューションもあります制限。

0
Elior Malul