[PYTHON] Warum meine Redis so langsam waren

Redis ist KVS, nicht schnell?

Es gab eine Zeit, in der ich das dachte. Wenn Sie Redis nicht richtig verwenden, sinkt die Leistung auf 1/10 oder weniger. In diesem Artikel haben wir die Leistung der Implementierung gemessen, die die Leistung von Redis demonstriert, und die Implementierung, die dies nicht tut.

Fazit

Erste Schlussfolgerung

Die ursprüngliche Leistung von Redis kann mithilfe von Befehlen wie mget / mset erreicht werden, die mehrere Daten gleichzeitig lesen und schreiben. Im Gegenteil, wenn Sie einfach `` `für``` verwenden und einen Befehl wie get / set verwenden, um die Schleife nacheinander zu drehen, tritt eine große Leistungsverschlechterung auf.

Umgebung

Messen Sie mit Python3.

Redis wurde von Docker betrieben.

$ docker run --name redis -d -p 6379:6379 redis:3.2.8
$ redis-cli
127.0.0.1:6379> ping

Ich habe redis-cli separat installiert, werde es aber nur für diese Kommunikationsbestätigung im Artikel verwenden.

messen

Ich werde 10000 Daten schreiben und messen. Um die Bedingungen zu erfüllen, wird flushdb () verwendet, um Redis vor dem Schreiben von Daten zu bereinigen und zu messen. Das timeit-Modul von Python fasst auch die Ausführungsgeschwindigkeit auf einmal zusammen.

Versuchen Sie, eins nach dem anderen in einer Schleife zu schreiben

$ cat forloop.py 
import timeit
code = '''
import redis
r = redis.StrictRedis()
r.flushdb()
for i in range(10000):
	r.set(i, i)
'''
print(timeit.timeit(code,number=1))
$ python forloop.py 
5.071391730001778

Ungefähr 5 Sekunden nach 10000 Schreibvorgängen. Es ist jedes Mal 0,5 ms, aber ich habe zu diesem Zeitpunkt nicht viel nachgedacht, bis es langsam war ...

100 mal für 100 Fälle

Um 10000 Artikel zu schreiben, werde ich es in "100 Artikel alle 100 Mal" zusammenfassen. Im Befehl redis wird set zu mset.

$ cat chunk.py 
import timeit
code = '''
import redis
r = redis.StrictRedis()
r.flushdb()
for i in range(100):
    kv = {str(j):j for j in range(i*100,(i+1)*100)}
    r.mset(kv)
'''
print(timeit.timeit(code,number=1))
seiket-mba2011:sandbox seiket$ python chunk.py 
0.2815354660015146

Ungefähr 0,28 Sekunden, um 10000 Datensätze zu schreiben 0,028 ms pro Fall ** 10 mal schneller als eins nach dem anderen schreiben **. Macht es hier einen Unterschied? !!

Schreiben Sie 10000 Fälle in 1 Schuss

Da es eine große Sache ist, schreiben Sie 10.000 Artikel gleichzeitig

$ cat all.py 
import timeit
code = '''
import redis
r = redis.StrictRedis()
r.flushdb()
kv = {str(j):j for j in range(10000)}
r.mset(kv)
'''
print(timeit.timeit(code,number=1))
seiket-mba2011:sandbox seiket$ python all.py 
0.22943834099714877

Es ist noch schneller.

Zusammenfassung mit Messergebnissen

Die Schreibgeschwindigkeit für Redis ist beim gemeinsamen Schreiben überwältigend unterschiedlich. Die folgenden Unterschiede wurden für 10000 Schreibvorgänge gemacht.

Wie schreibt man Zeitaufwand für das Schreiben von 10.000 Datensätzen (Sek.)
10000 mal eins nach dem anderen 5.071
100 mal für 100 Fälle 0.281
Jeweils 10000 Fälle 0.229

Wie Sie der obigen Tabelle entnehmen können, verbessert das Schreiben in Redis in einem Stapel die Leistung um das Zehnfache oder mehr ** (oder ** das Schreiben nacheinander führt zu einer Leistungsverschlechterung von 1/10 oder weniger ** ) Tritt ein. Wenn überhaupt, halte ich ** Leistungseinbußen ** für angemessener.

Obwohl im Artikel nicht erwähnt, gibt es eine ähnliche Tendenz beim Lesen, so dass es in Bezug auf die Leistung überwiegend besser ist, alles auf einmal zu lesen. Besonders wenn Redis aus Geschwindigkeitsgründen verwendet werden, ist der Zugriff nacheinander tödlich langsam.

gist

Der für die Messung verwendete Quellcode ist der gleiche wie im Artikel, wird jedoch auch unten angezeigt. https://gist.github.com/seiketkm/3ca7deb28e8b0579a6e443cc7f8f9f65

Recommended Posts

Warum meine Redis so langsam waren
Warum Django-Import-Export-Import so langsam ist und was zu tun ist