hkeys - Obtenga todas las claves en la base de datos Redis con python
redis instructions (3)
Sí, use las keys()
del módulo StrictRedis:
>>> import redis
>>> r = redis.StrictRedis(host=YOUR_HOST, port=YOUR_PORT, db=YOUR_DB)
>>> r.keys()
Dando un patrón nulo los buscará a todos. Según la página vinculada:
teclas (patrón = ''*'')
Devuelve una lista de claves que coinciden con el patrón
Hay una publicación sobre un comando Redis para obtener todas las claves disponibles, pero me gustaría hacerlo con Python.
Alguna forma de hacer esto?
scan()
es superior a keys()
para grandes cantidades de claves porque te da un iterador que puedes usar en lugar de intentar cargar todas las claves en la memoria.
Tenía un 1B registros en mi redis y nunca pude obtener suficiente memoria para devolver todas las claves a la vez.
ESCANEANDO LLAVES UNA POR UNA
Aquí hay un fragmento de Python usando scan()
para obtener todas las claves de la tienda que coincidan con un patrón y eliminarlas una a 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)
ESCANEADO EN LOTES
Si tiene una lista muy grande de claves para escanear, por ejemplo, más de 100k claves, será más eficiente escanearlas en lotes, como este:
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)
Hice una evaluación comparativa de esta secuencia de comandos y descubrí que usar un tamaño de lote de 500 era 5 veces más rápido que escanear las teclas una a una. Un tamaño de lote de 500 parecía ser óptimo para ejecutarse localmente en mi Macbook Pro, podría diferir en una red. Probé tamaños de lote de 10, 100, 500, 1000 y 10000. Contácteme si desea ver cómo lo comparaté.
Tenga en cuenta que si usa el método scan()
o keys()
, la operación no es atómica y podría fallar en el proceso.
DEFINITIVAMENTE EVITE UTILIZAR XARGS EN LA LÍNEA DE COMANDOS
No recomiendo este ejemplo que encontré repetido en otro lugar. No funcionará para claves Unicode y es increíblemente lento incluso para un número moderado de teclas:
redis-cli --raw keys "user:*"| xargs redis-cli del
¡En este ejemplo, xargs crea un nuevo proceso de redis-cli para cada clave! ¡Ay!
Hice una evaluación comparativa de este enfoque para que sea 4 veces más lento que el primer ejemplo de Python donde eliminó cada clave una por una y 20 veces más lentamente que eliminar en lotes de 500.
import redis
r = redis.Redis("localhost", 6379)
for key in r.scan_iter():
print key
usando la biblioteca de Pyredis
Disponible desde 2.8.0.
Complejidad del tiempo: O (1) para cada llamada. O (N) para una iteración completa, que incluye suficientes llamadas de comando para que el cursor regrese a 0. N es la cantidad de elementos dentro de la colección.