Aufgrund geänderter Anforderungen erforderte ein früheres Projekt Änderungen am in Redis gespeicherten Datenformat. Um zu verhindern, dass alte Daten in neue Daten eingefügt werden, nachdem das neue Paket veröffentlicht wurde. Daher müssen vor der Veröffentlichung alle alten Daten gelöscht werden. Derzeit ist Redis ein öffentlicher Cluster, an dem mehrere Unternehmen beteiligt sind. Dann stellt sich die Frage, wie man eine große Menge alter Daten (die Gesamtzahl der Schlüssel in der Bibliothek beträgt derzeit 12 Millionen) löschen kann, ohne die Nutzung anderer Unternehmen zu beeinträchtigen.
###Gemeinsame Methoden zum stapelweisen Löschen von Redis-Daten:
Wenn der Schlüssel der zu löschenden Daten bekannt ist Sie können den del-Befehl von redis-cli /usr/local/redis/bin/redis-cli del key verwenden oder auch das Redis-Paket oder die Redis-Bibliothek verwenden, die anderen Hochsprachen entspricht. Zum Beispiel Jedis unter Java und Redis-Bibliothek unter Python
java: jdeis.del(key) python: redis.delete(key)
Wenn der Schlüssel der zu löschenden Daten unbekannt ist, ist nur der Schlüssel bekannt, der einem bestimmten Muster entspricht. In diesem Fall müssen Sie den Befehl „keys“ von redis verwenden, um die Schlüssel zu finden, die dem spezifischen Muster entsprechen
Alle Schlüssel finden, die dem Präfix „video“ entsprechen
/usr/local/redis/bin/redis-cli keys video_*
Sie können xargs von Linux verwenden um den Stapellöschvorgang abzuschließen/ usr/local/redis/bin/redis-cli-Schlüsselvideo* | Sie können Flushdb verwenden, um die gesamte Bibliothek zu löschen erfordert klare Kenntnisse des spezifischen Schlüssels
Verwenden Sie den Befehl „keys“. Wenn die Datenmenge in der Bibliothek zu groß ist, blockiert der Befehl „keys“ alle anderen Anforderungen für Redis. Zweifellos ist dieser Ansatz für öffentliche Redis-Cluster nicht ratsam. Natürlich müssen spezifische Geschäftsanforderungen berücksichtigt werden. Wenn das nicht funktioniert, können Sie das Löschskript auch zu einem Zeitpunkt ausführen, an dem der Geschäftsverkehr relativ gering ist. Durch die Verwendung von „flushdb“ werden die Daten in der gesamten Bibliothek bereinigt.
###Meine Lösung Der Online-Redis-Cluster verwendet die Matser-Slave-Struktur. Daher kann der Befehl „keys“, der die Anforderung blockiert, auf dem Slave-Knoten ausgeführt werden, um alle Schlüssel zu finden, die dem spezifischen Präfix entsprechen. Verwenden Sie dann ein Shell-Skript oder eine Hochsprache, um die Daten auf dem Masterknoten zu löschen.
# Holen Sie sich alle Schlüssel, deren Präfix Video, Album, Schauspieler ist, und hängen Sie diese Schlüssel an und exportieren Sie sie in die Datei /data/keys.txt
#!/bin/bash
keys=('video' 'album' 'actor'); host='localhost'; port='6378'; for key in ${keys[@]}; do cmd="/usr/local/redis/bin/redis-cli -h ${host} -p ${port} keys gal.video.${key}* >> /data/keys.txt"; echo ${cmd}; eval ${cmd}; done; # 根据前面生成的key,删除数据 #!/bin/bash host='localhost'; port='6378'; file="/data/keys.txt"; i=0; cat ${file} | while read key; do let i=i+1; cmd="/usr/local/redis/bin/redis-cli -h ${host} -p ${port} del ${key}"; echo "line:"${i}",cmd:"${cmd}; eval ${cmd}; done;
Da Skript 2 del-Befehle einzeln sendet, ist die Ausführungseffizienz recht gering. Im Test wurden in einer Stunde etwa 1,2 Millionen Daten gelöscht. 12 Millionen Elemente müssen in 10 Stunden gelöscht werden! ! ! Angesichts der Zeit, die zum Senden jeder Anfrage benötigt wird, dachte ich darüber nach, die Redis-Pipeline zu verwenden, um die Batch-Übermittlung zu implementieren.
__author__ = 'litao' from redis import Redis host="127.0.0.1" port=6379 db=0 r =Redis(host,port,db) pl=r.pipeline() per_pipe_size=10000 count=0 file = open("/data/keys.txt") print "start del all keys in "+file.name while 1: lines = file.readlines(10000) if not lines: break for key in lines: key=key.strip('\n') pl.delete(key) count=count+1 if(count==per_pipe_size): count=0 pl.execute() pl.execute() file.close() print 'finish del all keys'
Die Online-Ausführung des verbesserten Skripts 2 dauert nur etwa 2 Minuten! !
Das obige ist der detaillierte Inhalt vonWie lösche ich Daten in Redis?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!