Redis
 sql >> Base de données >  >> NoSQL >> Redis

Obtenir toutes les clés de la base de données Redis avec python

Utilisez scan_iter()

scan_iter() est supérieur à keys() pour un grand nombre de clés, car cela vous donne un itérateur que vous pouvez utiliser plutôt que d'essayer de charger toutes les clés en mémoire.

J'avais des enregistrements 1B dans mon redis et je ne pouvais jamais obtenir assez de mémoire pour retourner toutes les clés à la fois.

SCANNER LES TOUCHES UNE PAR UNE

Voici un extrait de python utilisant scan_iter() pour obtenir toutes les clés du magasin correspondant à un modèle et les supprimer une par une :

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

NUMÉRISATION PAR LOTS

Si vous avez une très grande liste de clés à analyser - par exemple, plus de 100 000 clés - il sera plus efficace de les analyser par lots, comme ceci :

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)

J'ai comparé ce script et constaté que l'utilisation d'une taille de lot de 500 était 5 fois plus rapide que l'analyse des clés une par une. J'ai testé différentes tailles de lot (3, 50, 500, 1 000, 5 000) et j'ai constaté qu'une taille de lot de 500 semble être optimale.

Notez que si vous utilisez le scan_iter() ou keys() méthode, l'opération n'est pas atomique et peut échouer en cours de route.

ÉVITER ABSOLUMENT D'UTILISER XARGS SUR LA LIGNE DE COMMANDE

Je ne recommande pas cet exemple que j'ai trouvé répété ailleurs. Il échouera pour les clés Unicode et est incroyablement lent même pour un nombre modéré de clés :

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

Dans cet exemple, xargs crée un nouveau processus redis-cli pour chaque clé ! c'est mauvais.

J'ai évalué cette approche comme étant 4 fois plus lente que le premier exemple python où elle supprimait chaque clé une par une et 20 fois plus lente que la suppression par lots de 500.