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 |
Não |
Baixo |
|
|
Preciso excluir chaves por padrão em produção |
Não |
Baixo |
|
|
Preciso de máximo throughput para exclusão em lote |
Não |
Baixo |
|
|
Estou em ambiente de dev/teste com poucas chaves |
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: |
|
host |
O endpoint da instância Tair. Consulte Visualizar endpoints. |
|
port |
Número da porta. Padrão: |
|
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: |
|
password |
A senha usada para acessar a instância. Consulte Métodos de autenticação para instâncias. |
|
key |
Padrão de chave. Exemplo: |
Sintaxe de padrões
|
Padrão |
Correspondências |
|
|
Strings de 5 caracteres: |
|
|
Qualquer tamanho: |
|
|
|
|
|
|
|
|
|
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: |
|
password |
A senha usada para acessar a instância. Consulte Métodos de autenticação para instâncias. |
|
key |
Padrão de chave. Exemplo: |
Sintaxe de padrões
|
Padrão |
Correspondências |
|
|
Strings de 5 caracteres: |
|
|
Qualquer tamanho: |
|
|
|
|
|
|
|
|
|
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)
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: |
|
password |
A senha usada para acessar a instância. Consulte Métodos de autenticação para instâncias. |
|
key |
Padrão de chave. Exemplo: |
Sintaxe de padrões
|
Padrão |
Correspondências |
|
|
Strings de 5 caracteres: |
|
|
Qualquer tamanho: |
|
|
|
|
|
|
|
|
|
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:
-
Use o parâmetro -n para especifique o banco de dados (Recomendado):
redis-cli -h <host> -p <port> -a <password> -n <db> -
Use o comando SELECT para alternar para o banco de dados:
redis-cli -h <host> -p <port> -a <password> > SELECT <db>