Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Holen Sie sich alle Schlüssel in der Redis-Datenbank mit Python

Verwenden Sie scan_iter()

scan_iter() ist keys() überlegen für eine große Anzahl von Schlüsseln, weil es Ihnen einen Iterator gibt, den Sie verwenden können, anstatt zu versuchen, alle Schlüssel in den Speicher zu laden.

Ich hatte 1B Datensätze in meinem Redis und konnte nie genug Speicher bekommen, um alle Schlüssel auf einmal zurückzugeben.

SCHLÜSSEL NACHEINANDER SCANNEN

Hier ist ein Python-Snippet mit scan_iter() um alle Schlüssel aus dem Geschäft zu erhalten, die einem Muster entsprechen, und sie einzeln zu löschen:

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
    # delete the key
    r.delete(key)

stapelweise scannen

Wenn Sie eine sehr große Liste von Schlüsseln scannen müssen – zum Beispiel mehr als 100.000 Schlüssel – ist es effizienter, sie wie folgt in Stapeln zu scannen:

import redis
from itertools import izip_longest

r = redis.StrictRedis(host='localhost', port=6379, db=0)

# iterate a list in batches of size n
def batcher(iterable, n):
    args = [iter(iterable)] * n
    return izip_longest(*args)

# in batches of 500 delete keys matching user:*
for keybatch in batcher(r.scan_iter('user:*'),500):
    r.delete(*keybatch)

Ich habe dieses Skript einem Benchmarking unterzogen und festgestellt, dass die Verwendung einer Stapelgröße von 500 fünfmal schneller war als das Scannen von Schlüsseln einzeln. Ich habe verschiedene Stapelgrößen (3,50,500,1000,5000) getestet und festgestellt, dass eine Stapelgröße von 500 optimal zu sein scheint.

Beachten Sie, ob Sie scan_iter() verwenden oder keys() -Methode ist die Operation nicht atomar und könnte auf halbem Weg fehlschlagen.

VERMEIDEN SIE DEFINITIV, XARGS IN DER KOMMANDOZEILE ZU VERWENDEN

Ich empfehle dieses Beispiel nicht, das ich an anderer Stelle wiederholt gefunden habe. Es schlägt bei Unicode-Schlüsseln fehl und ist selbst bei einer moderaten Anzahl von Schlüsseln unglaublich langsam:

redis-cli --raw keys "user:*"| xargs redis-cli del

In diesem Beispiel erstellt xargs für jeden Schlüssel einen neuen redis-cli-Prozess! das ist schlecht.

Ich habe festgestellt, dass dieser Ansatz viermal langsamer ist als das erste Python-Beispiel, in dem jeder Schlüssel einzeln gelöscht wurde, und 20-mal langsamer als das Löschen in Stapeln von 500.