35

ローカルマシンで簡単なパフォーマンステストを実行しました。これはPythonスクリプトです。

import redis
import sqlite3
import time

data = {}
N = 100000

for i in xrange(N):
    key = "key-"+str(i)
    value = "value-"+str(i)
    data[key] = value

r = redis.Redis("localhost", db=1)
s = sqlite3.connect("testDB")
cs = s.cursor()

try:
    cs.execute("CREATE TABLE testTable(key VARCHAR(256), value TEXT)")
except Exception as excp:
    print str(excp)
    cs.execute("DROP TABLE testTable")
    cs.execute("CREATE TABLE testTable(key VARCHAR(256), value TEXT)")

print "[---Testing SQLITE---]"
sts = time.time()
for key in data:
    cs.execute("INSERT INTO testTable VALUES(?,?)", (key, data[key]))
    #s.commit()
s.commit()
ste = time.time()
print "[Total time of sql: %s]"%str(ste-sts)

print "[---Testing REDIS---]"
rts = time.time()
r.flushdb()# for empty db
for key in data:
    r.set(key, data[key])
rte = time.time()
print "[Total time of redis: %s]"%str(rte-rts)

redisのパフォーマンスは速くなると思っていましたが、結果はそれがはるかに遅いことを示しています。

[---Testing SQLITE---]
[Total time of sql: 0.615846157074]
[---Testing REDIS---]
[Total time of redis: 10.9668009281]

それで、redisはメモリベースです、sqliteはどうですか?なぜredisはとても遅いのですか?redisを使用する必要がある場合とsqliteを使用する必要がある場合

4

4 に答える 4

45

redisドキュメントから

Redisはサーバーです。すべてのコマンドにはネットワークまたはIPCラウンドトリップが含まれます。SQLite、Berkeley DB、Tokyo /KyotoCabinetなどの組み込みデータストアと比較しても意味がありません...ほとんどの操作のコストはネットワーク/プロトコル管理によって正確に支配されているためです。

場合によっては速度の問題を認識していますが、これは理にかなっています。たとえば、Redisは、複数の並列アクセスの下でsqliteよりもはるかに優れたパフォーマンスを発揮する可能性があります。

適切な仕事のための適切なツール。場合によっては、それが再実行されることもあれば、sqliteになることもあれば、まったく異なるものになることもあります。この速度テストがアプリが実際に何をするかを適切に示している場合、sqliteの方が優れているので、このベンチマークを実行したのは良いことです。

于 2012-06-26T22:14:10.873 に答える
33

現在の回答は、Redisがこの特定のベンチマークを失う理由、つまりサーバーに対して実行されるすべてのコマンドによって生成されるネットワークオーバーヘッドに関する洞察を提供しますが、Redisのパフォーマンスを加速するためにベンチマークコードをリファクタリングする試みは行われていません。

コードの問題はここにあります:

for key in data:
    r.set(key, data[key])

Redisサーバーへのラウンドトリップが100,000回発生するため、I/Oのオーバーヘッドが大きくなります。

Redisは特定のコマンドに「バッチ」のような機能を提供するため、これは完全に不要です。したがって、SETにはMSETがあり、上記を次のようにリファクタリングできます。

r.mset(data)

100,000台のサーバーが1台になります。Pythonディクショナリを単一の引数として渡すだけで、Redisはサーバーに更新をアトミックに適用します。

これにより、特定のベンチマークにすべての違いが生じます。Redisは少なくともSQLiteと同等のパフォーマンスを発揮するはずです。

于 2013-08-29T09:16:31.597 に答える
13

SQLiteは非常に高速であり、必要なIOアクションは1つだけです(上でcommit)。Redisはネットワーク上にあるため、大幅に多くのIOを実行しています。より多くのリンゴとリンゴの比較には、ネットワーク(MySQLやPostgreSQLなど)を介してアクセスされるリレーショナルデータベースが含まれます。

また、SQLiteは長い間使用されており、非常に高度に最適化されていることにも注意してください。ACIDコンプライアンスによって制限されますが、実際にはオフにして(一部のNoSQLソリューションのように)、さらに高速に取得できます。

于 2012-06-26T22:26:58.173 に答える
11

redisのコミットをパイプライン処理していないことに気づきました。ピップラインを使用すると、時間が短縮されます。

[---SQLITEのテスト---]

[SQLの合計時間:0.669369935989]

[---REDISのテスト---]

[redisの合計時間:2.39369487762]

于 2013-06-27T18:27:34.480 に答える