Redis
 sql >> Database >  >> NoSQL >> Redis

Ottieni tutte le chiavi nel database Redis con Python

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.