1. ホーム
  2. python

[解決済み] この単純なベンチマークで、なぜSQLiteはRedisより速いのか?

2022-02-19 15:54:55

質問

私は、私のローカルマシンで簡単なパフォーマンステストを行いました。

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を使うべきとき?

解決方法は?

から redis ドキュメント

Redisはサーバです。すべてのコマンドはネットワークまたはIPCのラウンドトリップを伴います。SQLite、Berkeley DB、Tokyo/Kyoto Cabinetなどの組み込み型データストアと比較するのは無意味です。ほとんどの操作のコストは、まさにネットワークやプロトコルの管理に支配されているからです。

それは、ある種のケースにおけるスピードの問題を認めていることになりますが、理にかなっています。例えば、何倍もの並列アクセスでは、Redisはsqliteよりずっと良いパフォーマンスを示すかもしれません。

適材適所のツール あるときはredis、あるときはsqlite、またあるときは全く別のものになります。このスピードテストが、あなたのアプリが現実的に行うことを適切に示しているのであれば、sqliteはより良いサービスを提供するでしょうし、あなたがこのベンチマークを行ったことは良いことです。