Por que o SQLite é mais rápido do que o Redis nesta SIMPLES referência?

fiz um teste de desempenho simples na minha máquina local, este é o programa em 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)

esperava que o redis tivesse um desempenho mais rápido, mas o resultado mostra que é muito mais lento:

[---Testing SQLITE---]
[Total time of sql: 0.615846157074]
[---Testing REDIS---]
[Total time of redis: 10.9668009281]
Então, o redis é baseado na memória, e o sqlite? Porque é que o redis é tão lento? Quando preciso de usar redis e quando preciso de usar sqlite?

Author: torayeff, 2012-06-26

4 answers

Da documentação de refazer

Redis é um servidor: todos os comandos envolvem redondas de rede ou IPC. Não faz sentido compará-lo com dados embutidos como SQLite, Berkeley DB, Gabinete de Tóquio/Kyoto, etc ... porque o custo da maioria das operações é precisamente dominado pela gestão de Rede/Protocolo.

O que faz sentido, embora seja um reconhecimento de problemas de Velocidade em certos casos. O Redis pode ter um desempenho muito melhor do que o sqlite em baixo. múltiplos de acesso paralelo, por exemplo.

a ferramenta certa para o trabalho certo , às vezes será redis outras vezes sqlite outras vezes algo totalmente diferente. Se este teste de velocidade é uma boa demonstração do que o seu aplicativo realisticamente vai fazer, em seguida, sqlite irá atendê-lo melhor e é bom que você fez esta referência.

 43
Author: Harald Brinkhof, 2012-06-26 22:14:10

As respostas actuais dão uma ideia da razão pela qual a Redis perde esta referência em particular, ou seja, a sobrecarga de rede gerada por cada comando executado contra o servidor, no entanto, não foi feita qualquer tentativa de refactor do código de referência para acelerar o desempenho da Redis.

O problema com o seu código está aqui:

for key in data:
    r.set(key, data[key])
Incendeias 100 mil viagens de ida e volta ao servidor Redis, resultando em grandes despesas.

Isto é totalmente desnecessário porque o Redis fornece "lote" como funcionalidade para certos comandos, por isso para o conjunto existe o MSET, para que possa refacturar o acima para:

r.mset(data)
De 100 mil viagens de servidor para 1. Você simplesmente passa o dicionário Python como um único argumento e o Redis irá aplicar atomicamente a atualização no servidor.

Isto fará toda a diferença na sua referência em particular, você deve ver o Redis executar pelo menos ao par com o SQLite.

 30
Author: user2014979, 2013-08-29 09:16:31

O SQLite é muito rápido, e você só precisa de uma acção IO (no commit). A Redis está a fazer muito mais desde que está na rede. Uma comparação mais maçãs-para-maçãs envolveria um banco de dados relacional acessado através de uma rede (como MySQL ou PostgreSQL).

Também deve ter em mente que o SQLite existe há muito tempo e é Muito altamente optimizado. É limitado pela conformidade do ácido , mas você pode realmente desligar isso (como alguns As soluções NoSQL fazem), e obtê-lo ainda mais rápido.

 13
Author: Brendan Long, 2012-06-26 22:42:32
Acabei de reparar que não transferiste o compromisso para a redis. A utilização de tubulações reduz o tempo:

[---Teste SQLITE - - -]

[tempo Total de sql: 0, 669369935989]

[- - - - Testing REDIS - - -]

[tempo Total de redis: 2.39369487762]

 9
Author: basti, 2013-06-27 18:27:34