Todos os produtos
Search
Central de documentação

Tair (Redis® OSS-Compatible):Exclusão de chaves em massa

Última atualização: Jun 26, 2026

Exclua chaves de uma instância Tair em massa usando métodos não bloqueantes, como SCAN + UNLINK ou pipeline mode.

Escolha um método de exclusão

Cenário

Método

Bloqueante

Risco

Tenho uma lista de chaves específicas para excluir

Método 1: Excluir a partir de um arquivo

Não

Baixo

Preciso excluir chaves por padrão em produção

Método 2: SCAN + UNLINK (Recomendado)

Não

Baixo

Preciso de máximo throughput para exclusão em lote

Método 3: Pipeline mode

Não

Baixo

Estou em ambiente de dev/teste com poucas chaves

Método 4: KEYS + DEL (Use com cautela)

Sim

Alto

Observações importantes

  • Faça backup dos seus dados antes de excluir as chaves.

  • Execute as exclusões fora do horário de pico para minimizar o impacto.

  • Não é possível executar no DMS: utilize redis-cli ou um cliente Python em uma instância ECS ou máquina local.

Método 1: Excluir a partir de um arquivo

Indicado para uma lista predefinida de chaves armazenadas em um arquivo de texto.

Pré-requisitos

Grave as chaves a excluir em um arquivo de texto, uma chave por linha.

Comando

# UNLINK is non-blocking (Redis 4.0+). For earlier versions, use DEL.
cat <file> | xargs redis-cli -h <host> -p <port> -a <password> UNLINK

Parâmetros

Parâmetro

Descrição

file

Caminho para o arquivo que contém as chaves. Exemplo: key.txt

host

O endpoint da instância Tair. Consulte Visualizar endpoints.

port

Número da porta. Padrão: 6379.

password

A senha usada para acessar a instância. Consulte Métodos de autenticação para instâncias.

Exemplo

cat key.txt | xargs redis-cli -h r-bp127cu5tb*****.redis.rds.aliyuncs.com -a Test**** UNLINK

Verificar a exclusão

# Verify that keys are deleted. Expected result: 0
redis-cli -h <host> -p <port> -a <password> --scan --pattern '<key pattern in the file>' | wc -l

Método 2: SCAN + UNLINK (Recomendado)

Recomendado para produção. Varre e exclui chaves de forma iterativa sem bloquear o servidor.

Código

import redis
import sys

def main(argv):
    if len(argv) < 4:
        print("Usage: python scan_and_del.py host port password match")
        sys.exit(-1)

    host = argv[1]
    port = argv[2]
    password = argv[3]
    match = argv[4]
    print("host: %s, port: %s, password: %s, match: %s\n" % (host, port, password, match))

    redis_cli = redis.StrictRedis(host=host, port=port, password=password)
    cursor = 0
    rnd = 1

    while rnd == 1 or cursor != 0:
        result = redis_cli.scan(cursor=cursor, match=match, count=1000)
        ret_cursor = result[0]
        ret_keys = result[1]
        num_keys = len(ret_keys)
        print("del %d keys in round %d, cursor: %d" % (num_keys, rnd, ret_cursor))
        if 0 != num_keys:
            ret_unlink = redis_cli.unlink(*ret_keys)
            print("ret_unlink: %d, ret_keys: %s" % (ret_unlink, ret_keys))
        cursor = ret_cursor
        rnd += 1
        print("")

if __name__ == '__main__':
    main(sys.argv)

Executar

python scan_and_unlink.py <host> <port> <password> "<key>" 

Parâmetros

Parâmetro

Descrição

host

O endpoint da instância Tair. Consulte Visualizar endpoints.

port

Número da porta. Padrão: 6379

password

A senha usada para acessar a instância. Consulte Métodos de autenticação para instâncias.

key

Padrão de chave. Exemplo: "test*" corresponde a test1, test2, test3

Sintaxe de padrões

Padrão

Correspondências

w?rld

Strings de 5 caracteres: world, warld, wxrld

w*rld

Qualquer tamanho: wrld, woooorld

w[ae]rld

warld, werld (não world)

w[^e]rld

world, warld (não werld)

w[a-b]rld

warld, wbrld

Verificar a exclusão

Verifique se todas as chaves correspondentes foram excluídas:

redis-cli -h <host> -p <port> -a <password> --scan --pattern '<key>' | wc -l
# Expected output: 0

Método 3: Pipeline mode

Maximiza o throughput agrupando comandos UNLINK para reduzir as viagens de ida e volta pela rede.

# Generate UNLINK commands in RESP format and execute in pipe mode. For Redis versions earlier than 4.0, use DEL.
redis-cli -h <host> -p <port> -a <password> --scan --pattern 'test*' | \
awk '{printf "*2\r\n$6\r\nUNLINK\r\n$%d\r\n%s\r\n", length($0), $0}' | \
redis-cli -h <host> -p <port> -n <db> --pipe

Código

import redis
import sys

def main(argv):
    if len(argv) < 4:
        print("Usage: python scan_and_del_pipeline.py host port password match")
        sys.exit(-1)

    host = argv[1]
    port = int(argv[2])  # Convert port to integer
    password = argv[3]
    match = argv[4]
    print(f"host: {host}, port: {port}, password: {'*' * len(password)}, match: {match}\n")

    # After accumulating 1000 keys, submit a DEL command through the pipeline. You can adjust this number as needed.
    pipeline_batch_size = 1000
    
    redis_cli = redis.StrictRedis(host=host, port=port, password=password, decode_responses=True)
    
    cursor = 0
    total_deleted_count = 0
    keys_to_delete = []

    print("Starting key scan...")
    # Use a 'while True' loop and exit when the cursor is 0.
    while True:
        # 1. Scan a batch of keys.
        cursor, keys = redis_cli.scan(cursor=cursor, match=match, count=1000)

        if keys:
            # 2. Collect the scanned keys into a list for deletion.
            keys_to_delete.extend(keys)

        # 3. When the deletion list reaches the batch size or the scan is complete, execute the deletion.
        if len(keys_to_delete) >= pipeline_batch_size or cursor == 0:
            if keys_to_delete:
                print(f"Accumulated {len(keys_to_delete)} keys. Preparing to delete via Pipeline...")

                # --- Pipeline -----------
                pipe = redis_cli.pipeline(transaction=False, shard_hint=None)
                pipe.delete(*keys_to_delete)
                result = pipe.execute()
                # -------------------------

                deleted_in_batch = result[0]
                total_deleted_count += deleted_in_batch

                print(f"  -> Pipeline executed. Deleted {deleted_in_batch} keys in this batch.")

                # Clear the deletion list to prepare for the next batch.
                keys_to_delete = []

        # 4. If the scan is complete, exit the loop.
        if cursor == 0:
            break

    print(f"\nScan finished. Total keys deleted: {total_deleted_count}")

if __name__ == '__main__':
    main(sys.argv)
    

Executar

python scan_and_unlink_pipe.py <host> <port> <password> "<key>" 

Parâmetros

Parâmetro

Descrição

host

O endpoint da instância Tair. Consulte Visualizar endpoints.

port

Número da porta. Padrão: 6379

password

A senha usada para acessar a instância. Consulte Métodos de autenticação para instâncias.

key

Padrão de chave. Exemplo: "test*" corresponde a test1, test2, test3

Sintaxe de padrões

Padrão

Correspondências

w?rld

Strings de 5 caracteres: world, warld, wxrld

w*rld

Qualquer tamanho: wrld, woooorld

w[ae]rld

warld, werld (não world)

w[^e]rld

world, warld (não werld)

w[a-b]rld

warld, wbrld

Verificar

redis-cli -h <host> -p <port> -a <password> --scan --pattern '<key>' | wc -l
# Expected output: 0

Método 4: KEYS + DEL (Use com cautela)

Aviso

O comando KEYS bloqueia o servidor e pode causar alto consumo de CPU. Use este método apenas em ambientes de desenvolvimento ou durante janelas de manutenção planejadas.

Quando usar

  • Ambientes de desenvolvimento ou homologação

  • Bancos de dados com poucas chaves

  • Durante interrupções completas do serviço

Comando

redis-cli -h <host> -p <port> -a <password> KEYS "<key>" | xargs redis-cli -h <host> -p <port> -a <password> DEL

Parâmetros

Parâmetro

Descrição

host

O endpoint da instância Tair. Consulte Visualizar endpoints.

port

Número da porta. Padrão: 6379

password

A senha usada para acessar a instância. Consulte Métodos de autenticação para instâncias.

key

Padrão de chave. Exemplo: "test*" corresponde a test1, test2, test3

Sintaxe de padrões

Padrão

Correspondências

w?rld

Strings de 5 caracteres: world, warld, wxrld

w*rld

Qualquer tamanho: wrld, woooorld

w[ae]rld

warld, werld (não world)

w[^e]rld

world, warld (não werld)

w[a-b]rld

warld, wbrld

Exemplo

redis-cli -h r-bp127cu5tb*****.redis.rds.aliyuncs.com -a Test**** KEYS "test*" | xargs redis-cli -h r-bp127cu5tb*****.redis.rds.aliyuncs.com -a Test**** DEL

Verificar

redis-cli -h <host> -p <port> -a <password> --scan --pattern '<key>' | wc -l
# Expected output: 0

Perguntas frequentes

P: Por que o SCAN não encontra as chaves esperadas?

R: As chaves podem estar em um banco de dados diferente. Por padrão, uma instância Tair tem 256 bancos de dados. Execute INFO keyspace para identificar quais bancos de dados contêm chaves e, em seguida, use um dos métodos abaixo:

  1. Use o parâmetro -n para especifique o banco de dados (Recomendado):

    redis-cli -h <host> -p <port> -a <password> -n <db>
  2. Use o comando SELECT para alternar para o banco de dados:

    redis-cli -h <host> -p <port> -a <password>
    > SELECT <db>

Tópicos relacionados