Untuk menghapus kunci yang ditentukan secara massal, gunakan perintah Redis UNLINK bersama perintah Linux cat dan xargs. Untuk menghapus kunci yang sesuai dengan pola tertentu secara massal, gunakan perintah Redis SCAN dan UNLINK.
Catatan
Buat backup data Anda sebelum menghapus kunci, dan lakukan penghapusan selama jam sepi.
Jalankan contoh dalam topik ini dari client seperti redis-cli atau client Python pada Instance ECS atau mesin lokal. Anda tidak dapat menjalankan contoh ini di DMS.
Menghapus kunci yang ditentukan secara massal
Sebelum menjalankan perintah, tulis daftar kunci yang akan dihapus ke dalam file.
Perintah berikut membaca setiap baris dari file yang ditentukan sebagai kunci Redis, terhubung ke server Redis menggunakan redis-cli, lalu menghapus kunci tersebut menggunakan perintah UNLINK.
# Gunakan perintah asinkron UNLINK (Redis 4.0+) untuk menghindari pemblokiran. Jika versi Redis Anda lebih lama dari 4.0, ganti UNLINK dengan DEL.
cat <file> | xargs redis-cli -h <host> -p <port> -a <password> UNLINKPerintah Linux xargs memecah daftar parameter panjang menjadi segmen-segmen yang lebih kecil untuk diteruskan ke perintah lain. Hal ini menghindari error akibat daftar argumen yang terlalu panjang dan dapat digunakan sendiri atau bersama perintah lain melalui pipe dan operator redirection.
Deskripsi parameter:
file: Jalur file yang berisi kunci-kunci yang akan dihapus. Contohnya, key.txt.
host: Titik akhir instans Redis. Untuk informasi lebih lanjut, lihat View endpoints.
port: Nomor port instans Redis. Nilai default-nya adalah 6379.
password: Password instans Redis. Untuk informasi lebih lanjut, lihat Logon methods.
Contoh:
cat key.txt | xargs redis-cli -h r-bp127cu5tb*****.redis.rds.aliyuncs.com -a Test**** UNLINKMenghapus kunci yang sesuai dengan pola secara massal
Metode | Skenario |
(Direkomendasikan) Penghapusan kabur dengan SCAN dan UNLINK | Menghapus data dalam jumlah besar secara aman di lingkungan produksi. Metode ini non-blocking dan menjamin stabilitas layanan online Anda. |
Penghapusan kabur throughput tinggi dalam mode Pipeline | Memaksimalkan throughput dan mengurangi latensi jaringan dengan mengirimkan banyak perintah dalam satu batch. Metode ini ideal untuk skenario yang membutuhkan efisiensi penghapusan maksimal. |
Penghapusan kabur dengan KEYS dan DEL | Menghapus data dalam jumlah kecil di lingkungan pengembangan atau staging, atau selama gangguan layanan total. Perintah KEYS memblokir server dan sangat berisiko jika digunakan di lingkungan produksi. |
(Direkomendasikan) Penghapusan kabur dengan SCAN dan UNLINK
Metode ini melakukan pemindaian iteratif dan menghapus kunci yang sesuai dengan pola tertentu. Berikut adalah contoh kode Python:
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("Deleted %d keys in round %d, cursor: %d" % (num_keys, rnd, ret_cursor))
if 0 != num_keys:
ret_unlink = redis_cli.unlink(*ret_keys)
print("unlink returned: %d, keys unlinked: %s" % (ret_unlink, ret_keys))
cursor = ret_cursor
rnd += 1
print("")
if __name__ == '__main__':
main(sys.argv)Panggil kode contoh scan_and_unlink.py, tentukan informasi koneksi untuk instans Redis dan pola pencocokan kunci, untuk menghapus kunci berdasarkan pencocokan kabur.
python scan_and_unlink.py <host> <port> <password> "<key>" Deskripsi parameter:
host: Titik akhir instans Redis. Untuk informasi lebih lanjut, lihat View endpoints.
port: Nomor port instans Redis. Nilai default-nya adalah 6379.
password: Password instans Redis. Untuk informasi lebih lanjut, lihat Logon methods.
key: Pola untuk mencocokkan kunci dalam database. Misalnya,
"test*"mencocokkan kunci yang memiliki awalan test, sepertitest1,test2, dantest3.Untuk informasi lebih lanjut tentang pencocokan karakter wildcard:
w?rld: Mencocokkan string lima karakter yang dimulai dengan w dan diakhiri dengan rld, seperti world, warld, dan wxrld.
w*rld: Mencocokkan string apa pun yang dimulai dengan w dan diakhiri dengan rld, seperti wrld dan woooorld.
w[ae]rld: Mencocokkan warld dan werld, tetapi bukan world.
w[^e]rld: Mencocokkan world dan warld, tetapi bukan werld.
w[a-b]rld: Mencocokkan warld dan wbrld.
Penghapusan kabur throughput tinggi dalam mode Pipeline
Metode ini melakukan pemindaian iteratif untuk kunci yang sesuai dengan pola, lalu menggunakan pipeline untuk mengirim perintah UNLINK secara batch. Pendekatan ini secara signifikan mengurangi waktu perjalanan bolak-balik (RTT) jaringan. Berikut adalah contoh kode Python:
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]) # Konversi port ke integer
password = argv[3]
match = argv[4]
print(f"host: {host}, port: {port}, password: {'*' * len(password)}, match: {match}\n")
# Setelah mengumpulkan 1000 kunci, kirimkan perintah DEL melalui pipeline. Anda dapat menyesuaikan angka ini sesuai kebutuhan.
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...")
# Gunakan loop 'while True' dan keluar saat cursor bernilai 0.
while True:
# 1. Pindai batch kunci.
cursor, keys = redis_cli.scan(cursor=cursor, match=match, count=1000)
if keys:
# 2. Kumpulkan kunci yang dipindai ke dalam daftar untuk dihapus.
keys_to_delete.extend(keys)
# 3. Saat daftar penghapusan mencapai ukuran batch atau pemindaian selesai, lakukan penghapusan.
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.")
# Kosongkan daftar penghapusan untuk persiapan batch berikutnya.
keys_to_delete = []
# 4. Jika pemindaian selesai, keluar dari loop.
if cursor == 0:
break
print(f"\nScan finished. Total keys deleted: {total_deleted_count}")
if __name__ == '__main__':
main(sys.argv)
Jalankan kode contoh scan_and_unlink_pipe.py di atas dengan informasi koneksi untuk instans Redis dan pola pencocokan kunci untuk menghapus kunci berdasarkan pencocokan kabur.
python scan_and_unlink_pipe.py <host> <port> <password> "<key>" Deskripsi parameter:
host: Titik akhir instans Redis. Untuk informasi lebih lanjut, lihat View endpoints.
port: Nomor port instans Redis. Nilai default-nya adalah 6379.
password: Password instans Redis. Untuk informasi lebih lanjut, lihat Logon methods.
key: Pola untuk mencocokkan kunci dalam database. Misalnya,
"test*"mencocokkan kunci yang memiliki awalan test, sepertitest1,test2, dantest3.Untuk informasi lebih lanjut tentang pencocokan karakter wildcard:
w?rld: Mencocokkan string lima karakter yang dimulai dengan w dan diakhiri dengan rld, seperti world, warld, dan wxrld.
w*rld: Mencocokkan string apa pun yang dimulai dengan w dan diakhiri dengan rld, seperti wrld dan woooorld.
w[ae]rld: Mencocokkan warld dan werld, tetapi bukan world.
w[^e]rld: Mencocokkan world dan warld, tetapi bukan werld.
w[a-b]rld: Mencocokkan warld dan wbrld.
Penghapusan kabur dengan KEYS dan DEL
Menggunakan perintah KEYS dapat menyebabkan penggunaan CPU tinggi. Lakukan operasi ini selama jam sepi.
Menggunakan perintah KEYS pada database dengan banyak kunci dapat memengaruhi performa. Gunakan perintah ini hanya pada database dengan jumlah kunci yang kecil.
Jalankan perintah berikut untuk menemukan semua kunci yang sesuai menggunakan perintah KEYS dengan pola wildcard, lalu teruskan hasilnya ke perintah DEL untuk dihapus.
redis-cli -h <host> -p <port> -a <password> KEYS "<key>" | xargs redis-cli -h <host> -p <port> -a <password> DELDeskripsi parameter:
host: Titik akhir instans Redis. Untuk informasi lebih lanjut, lihat View endpoints.
port: Nomor port instans Redis. Nilai default-nya adalah 6379.
password: Password instans Redis. Untuk informasi lebih lanjut, lihat Logon methods.
key: Pola untuk mencocokkan kunci dalam database. Misalnya,
"test*"mencocokkan kunci yang memiliki awalan test, sepertitest1,test2, dantest3.Untuk informasi lebih lanjut tentang pencocokan karakter wildcard:
w?rld: Mencocokkan string lima karakter yang dimulai dengan w dan diakhiri dengan rld, seperti world, warld, dan wxrld.
w*rld: Mencocokkan string apa pun yang dimulai dengan w dan diakhiri dengan rld, seperti wrld dan woooorld.
w[ae]rld: Mencocokkan warld dan werld, tetapi bukan world.
w[^e]rld: Mencocokkan world dan warld, tetapi bukan werld.
w[a-b]rld: Mencocokkan warld dan wbrld.
Contoh:
redis-cli -h r-bp127cu5tb*****.redis.rds.aliyuncs.com -a Test**** KEYS "keys*" | xargs redis-cli -h r-bp127cu5tb*****.redis.rds.aliyuncs.com -a Test**** DELVerifikasi bahwa kunci telah dihapus
Jalankan perintah SCAN lagi untuk memastikan tidak ada kunci yang sesuai dikembalikan.
# Hitung jumlah kunci yang sesuai. Hasil yang diharapkan adalah 0.
redis-cli -h <host> -p <port> -a <password> --scan --pattern 'test:*' | wc -l