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


204

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

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

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


10
安いベンチマークは、ベンチマークがないよりも常に優れています。質問メイトをありがとう。
マジヤル2013年

2
一般に、5,000オペレーション/秒と10,000オペレーション/秒の違いを気にすることは、時期尚早な最適化のケースです。そうは言っても、それはまだ興味深い答えです:)
Kevin

回答:


238

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

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


3
MongoDBとRedisは異なる永続化構造を持ち、Redisはメモリに収まるデータスキーマのみをサポートすることはコメントに値します。RAMは安価ですが、12〜16 GBを超えるデータを使用/保存する必要がある場合は、サーバーオプションがどのようになるかを確認します。
Tracker1

53
@sivannこの投稿は、ベンチマークなしから明確に述べられた「大まかな」ベンチマークになります。「ベンチマークは誤解を招く」というナンセンスでトロルにならないでください。もちろん、さまざまな条件によって結果が変わる可能性があります。あなたのケースをテストし、代わりにこの投稿からリンクする独自のベンチマークを返送して送信してください。そうすれば、「テストされた」意見からすべての利益を得られます。
Homer6、2013年

2
@sivannデフォルト(出荷時)の構成は、このベンチマークがテストしたものです。私見、デフォルトの設定は、パッケージがfsyncフェンスのどちら側に置かれるかを決定します。Redisでは、データベースがシステムメモリの合計よりも大きい場合に他の代替手段を使用するように促すメモリサーバーとして宣伝されています。MongoDBの場合、データベースとして宣伝されます。Postgresは明らかに永続化キャンプにいるため、fsyncをオフにすることはありません。ほとんどの人は設定を変更しないので、このベンチマークはそれらの場合には多少正確です。
Homer6 2013年

4
@sivannに同意します。投稿したベンチマークには致命的な欠陥があります。MongoDBはマルチスレッドであり、Redisはそうではありません。ベンチマークがマルチスレッドであった場合、MongoDbは実際にはマルチコアマシンでのスループットが高いことがわかります。
ColinM 2013年

2
@ Homer6は、メモリ指向のDBの場合でも、WriteConcernを有効(デフォルトでは無効)にしてテストする必要があります。なしでのテストは、どんな種類のベンチマークにとっても実際にはナンセンスです。reddisも同様です。すべてのトランザクションがディスク上で同期しないDBは、少なくとも2つのサーバーにデータを複製することで安全性を維持します。つまり、書き込みはディスク同期を待つのではなく、ネットワークレプリケーションを待ってから戻ります。エラーを待たないことは、製品では決して行われません。ネットワークへの書き込み時にネットワークケーブルが接続されているかどうかを検出しないように。
sivann 2013年

18

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

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


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

また、このブログ投稿では、両者を比較していますが、node.jsを使用しています。これは、時間とともにデータベース内のエントリ数が増加する効果を示しています。


8

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

結論: Redisはより高速になりますが、全体ではありません。


7

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

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

この問題の最善の解決策は、予想される状況で自分でテストを実行することだと思います。


Tornadoベンチマークは、RedisとMongoDbをZend_Cacheバックエンドとして使用する際の私自身のテストとよく一致しています。MongoDbの豊富な機能により、使用するリクエストが少なくなり、マルチスレッド設計は、マルチスレッドではない単一のRedisプロセスよりもはるかに優れたスケーリングが可能になります。結論は、MongoDbの方がスケールが大きいということです。また、Redisは仮想メモリをサポートしなくなりました。
ColinM 2013年

3

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

ただし、実際はアプリケーションのニーズと本番環境の設定によって異なります。この問題をWriteConcern.JOURNALED(oplogに書き込まれる)またはWriteConcern.FSYNCED(ディスクに書き込まれる)に変更するか、レプリカセット(バックアップ)に書き込むこともできます。必要な場合。

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.