【发布时间】:2012-06-26 22:07:41
【问题描述】:
我在本地机器上做了简单的性能测试,这是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?
【问题讨论】:
-
为什么 SQLite 会慢? ;-) 不要忘记,在这种情况下,SQLite 也是完全“进行中”(并且没有竞争)。另外,为什么要给
flushdb计时? -
听起来你已经阅读了太多 NoSQL 炒作。
-
@torayeff 您可以使用
CREATE TABLE IF NOT EXISTS进一步加快 sqlite 部分的速度,并且可以取出往返和 try/catch 块;) -
“小。快。可靠。选择任何三个。”需要我们多说吗?
-
嗯,内存中的数据不会持久化。如果您需要长时间保留它(或者它需要在崩溃中幸存下来),那么我建议您不要使用这种配置。我只是指出了在您的基准测试中进一步倾斜/调整/测试的方法。