Usa scan_iter()
scan_iter()
è superiore a keys()
per un gran numero di chiavi perché ti dà un iteratore che puoi usare invece di provare a caricare tutte le chiavi in memoria.
Avevo un record di 1B nel mio redis e non ho mai avuto memoria sufficiente per restituire tutte le chiavi contemporaneamente.
SCANSIONE DEI TASTI UNO PER UNO
Ecco uno snippet python che utilizza scan_iter()
per ottenere tutte le chiavi dal negozio che corrispondono a un modello ed eliminarle una per una:
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
# delete the key
r.delete(key)
SCANSIONE IN LOTTI
Se hai un elenco molto ampio di chiavi da scansionare, ad esempio più grande di>100.000 chiavi, sarà più efficiente scansionarle in batch, come questo:
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)
Ho confrontato questo script e ho scoperto che l'utilizzo di una dimensione batch di 500 era 5 volte più veloce della scansione delle chiavi una per una. Ho testato lotti di diverse dimensioni (3.50.500.1000.5000) e ho scoperto che un lotto di 500 sembra essere ottimale.
Nota che se usi scan_iter()
o keys()
metodo, l'operazione non è atomica e potrebbe non riuscire a metà.
ASSOLUTAMENTE EVITARE DI UTILIZZARE XARGS SULLA RIGA DI COMANDO
Non consiglio questo esempio che ho trovato ripetuto altrove. Non riuscirà per le chiavi Unicode ed è incredibilmente lento anche per un numero moderato di chiavi:
redis-cli --raw keys "user:*"| xargs redis-cli del
In questo esempio xargs crea un nuovo processo redis-cli per ogni chiave! è brutto.
Ho valutato questo approccio in modo che fosse 4 volte più lento del primo esempio Python in cui eliminava ogni chiave una alla volta e 20 volte più lento dell'eliminazione in batch di 500.