Heim > Java > javaLernprogramm > Hauptteil

Wie lösche ich Daten in Redis?

藏色散人
Freigeben: 2020-09-19 11:56:06
Original
16015 Leute haben es durchsucht

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.

Wie lösche ich Daten in Redis?

###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)
Nach dem Login kopieren

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_*
Nach dem Login kopieren

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;
Nach dem Login kopieren

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'
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage