Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Obtenha todas as chaves no banco de dados Redis com python


Use scan_iter()

scan_iter() é superior a keys() para um grande número de chaves porque fornece um iterador que você pode usar em vez de tentar carregar todas as chaves na memória.

Eu tinha 1B registros no meu redis e nunca consegui memória suficiente para retornar todas as chaves de uma só vez.

TECLAS DE DIGITALIZAÇÃO UMA POR UMA

Aqui está um trecho de python usando scan_iter() para obter todas as chaves da loja que correspondem a um padrão e excluí-las uma a uma:
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
    # delete the key
    r.delete(key)

DIGITALIZAÇÃO EM LOTES

Se você tiver uma lista muito grande de chaves para digitalizar - por exemplo, com mais de 100 mil chaves - será mais eficiente digitalizá-las em lotes, assim:
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)

Fiz um benchmark desse script e descobri que usar um tamanho de lote de 500 era 5 vezes mais rápido do que digitalizar as chaves uma a uma. Testei diferentes tamanhos de lote (3,50,500,1000,5000) e descobri que um tamanho de lote de 500 parece ser o ideal.

Observe que se você usar o scan_iter() ou keys() método, a operação não é atômica e pode falhar no meio do caminho.

DEFINITIVAMENTE EVITE USAR XARGS NA LINHA DE COMANDO

Não recomendo este exemplo que encontrei repetido em outros lugares. Ele falhará para chaves unicode e é incrivelmente lento para números moderados de chaves:
redis-cli --raw keys "user:*"| xargs redis-cli del

Neste exemplo xargs cria um novo processo redis-cli para cada chave! isso é ruim.

Eu avaliei essa abordagem para ser 4 vezes mais lenta que o primeiro exemplo python, onde excluiu todas as chaves uma a uma e 20 vezes mais lenta do que excluir em lotes de 500.