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.
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.
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.
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.
$ 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 ...
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? !!
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.
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