この Topic では、Redis で指定されたキーまたはパターンに一致するキーを一括削除する方法を示します。
注意事項
キーを削除する前にデータをバックアップし、オフピーク時に削除を実行してください。
この Topic の例は、インスタンスに接続されたクライアント (redis-cli または Python) から実行する必要があります。Data Management (DMS) では実行できません。
指定されたキーの一括削除
削除するキーを、1 行に 1 つのキーの形式でテキストファイルに保存します。
次のコマンドを実行して、指定されたキーを削除します:
# ブロッキングを避けるために非同期の UNLINK コマンド (Redis 4.0 以降) を使用します。Redis のバージョンが 4.0 より前の場合は、UNLINK を DEL に置き換えてください。 cat <file> | xargs redis-cli -h <host> -p <port> -a <password> UNLINKこのコマンドは、ファイルから各キーを読み取り、キーを xargs にパイプします。
xargsは、キーを redis-cli に渡してUNLINKで削除します。説明xargsコマンドは、長いパラメーターリストをより小さなセグメントに分割して他のコマンドに渡します。これにより、引数リストが長すぎることによるエラーを回避できます。パラメーター:
file: 削除するキーを含むファイルのパス。例:
key.txt。host: Redis インスタンスのエンドポイント。
port: Redis インスタンスのポート番号。デフォルト値: 6379。
password: Redis インスタンスへの接続に使用するパスワード。詳細については、「インスタンスに接続する」をご参照ください。
コマンドの例:
cat key.txt | xargs redis-cli -h r-bp127cu5tb*****.redis.rds.aliyuncs.com -a Test**** UNLINK
パターンに一致するキーの一括削除
次の表のメソッドを使用して、共通のプレフィックスやサフィックスを持つキーなど、パターンに一致するキーを一括削除します。
メソッド | ユースケース |
(推奨) | 本番環境で大量のデータを安全に削除します。このメソッドはノンブロッキングであり、オンラインサービスの安定性を確保します。 |
高スループット削除のためにパイプラインモードを使用 | コマンドをバッチで実行してスループットを最大化し、ネットワーク遅延を削減します。このメソッドは、最大の削除効率が要求されるシナリオに最適です。 |
| 開発環境またはテスト環境、あるいは完全なサービス停止中に少量のデータを削除します。 |
(推奨) SCAN と UNLINK を使用
このメソッドは、特定のパターンに一致するキーを繰り返しスキャンして削除します。
次のコードを
scan_and_unlink.pyスクリプトとして保存します: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)次のコマンドを実行してスクリプトを実行します:
python scan_and_unlink.py <host> <port> <password> "<key>"パラメーター:
host: Redis インスタンスのエンドポイント。
port: Redis インスタンスのポート番号。デフォルト値: 6379。
password: Redis インスタンスへの接続に使用するパスワード。詳細については、「インスタンスに接続する」をご参照ください。
key: 削除したいキーに一致させるために使用するパターン。たとえば、
"test*"は、testプレフィックスを持つすべてのキーに一致します。例:test1、test2、test3。次の例は、パターンマッチングにワイルドカードを使用する方法を示しています:
w?rld:wで始まり、rldで終わる 5 文字の文字列 (world、warld、wxrldなど) に一致します。w*rld:wで始まり、rldで終わる任意の文字列に一致します。たとえばwrldやwoooorldなどです。w[ae]rld:warldとwerldには一致しますが、worldには一致しません。w[^e]rld:worldとwarldには一致しますが、werldには一致しません。w[a-b]rld:warldとwbrldに一致します。
高スループット削除のためにパイプラインモードを使用
このメソッドは、特定のパターンに一致するキーを繰り返しスキャンし、パイプラインを使用して UNLINK コマンドをバッチで送信します。このアプローチにより、ラウンドトリップタイム (RTT) が大幅に削減されます。
次のコードを
scan_and_unlink_pipe.pyスクリプトとして保存します: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]) # ポートを整数に変換 password = argv[3] match = argv[4] print(f"host: {host}, port: {port}, password: {'*' * len(password)}, match: {match}\n") # 1,000 個のキーを蓄積した後、パイプラインを通じて DEL コマンドを送信します。この数値は必要に応じて調整できます。 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...") # 'while True' ループを使用し、カーソルが 0 になったら終了します。 while True: # 1. キーのバッチをスキャンします。 cursor, keys = redis_cli.scan(cursor=cursor, match=match, count=1000) if keys: # 2. スキャンしたキーを削除用のリストに収集します。 keys_to_delete.extend(keys) # 3. 削除リストがバッチサイズに達したとき、またはスキャンが完了したときに、削除を実行します。 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...") # --- パイプライン ----------- 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.") # 次のバッチの準備のために削除リストをクリアします。 keys_to_delete = [] # 4. スキャンが完了したら、ループを終了します。 if cursor == 0: break print(f"\nScan finished. Total keys deleted: {total_deleted_count}") if __name__ == '__main__': main(sys.argv)次のコマンドを実行してスクリプトを実行します:
python scan_and_unlink_pipe.py <host> <port> <password> "<key>"パラメーター:
host: Redis インスタンスのエンドポイント。
port: Redis インスタンスのポート番号。デフォルト値: 6379。
password: Redis インスタンスへの接続に使用するパスワード。詳細については、「インスタンスに接続する」をご参照ください。
key: 削除したいキーに一致させるために使用するパターン。たとえば、
"test*"は、testプレフィックスを持つすべてのキーに一致します。例:test1、test2、test3。次の例は、パターンマッチングにワイルドカードを使用する方法を示しています:
w?rld:wで始まりrldで終わる、world、warld、wxrldなどの 5 文字の文字列に一致します。w*rld:wで始まりrldで終わる文字列に一致します。たとえば、wrldやwoooorldなどです。w[ae]rld:warldとwerldには一致しますが、worldには一致しません。w[^e]rld:worldとwarldには一致しますが、werldには一致しません。w[a-b]rld:warldとwbrldに一致します。
KEYS と DEL を使用
KEYS コマンドは、キースペース全体をスキャンするブロッキング操作です。キーの数が多いデータベースでは、CPU 使用率が高くなり、パフォーマンスが低下する可能性があります。この操作は、オフピーク時に、キーの数が非常に少ないデータベースでのみ実行してください
次のコマンドを実行して、指定されたパターンに一致するキーを削除します:
redis-cli -h <host> -p <port> -a <password> KEYS "<key>" | xargs redis-cli -h <host> -p <port> -a <password> DELこのコマンドは、KEYS とワイルドカード パターンを使用して一致するすべてのキーを検索し、それらを xargs にパイプします。これにより、キーが DEL に渡されて削除されます。
パラメーター:
host: Redis インスタンスのエンドポイント。
port: Redis インスタンスのポート番号。デフォルト値: 6379。
password: Redis インスタンスへの接続に使用するパスワード。詳細については、「インスタンスに接続する」をご参照ください。
key: 削除したいキーに一致させるために使用するパターン。たとえば、
"test*"は、testプレフィックスを持つすべてのキーに一致します。例:test1、test2、test3。次の例は、パターンマッチングにワイルドカードを使用する方法を示しています:
w?rld:wで始まり、rldで終わる、world、warld、wxrldなどの 5 文字の文字列に一致します。w*rld:wで始まりrldで終わる、wrldやwoooorldなどの任意の文字列に一致します。w[ae]rld:warldとwerldには一致しますが、worldには一致しません。w[^e]rld:worldとwarldには一致しますが、werldには一致しません。w[a-b]rld:warldとwbrldに一致します。
コマンドの例:
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**** DEL削除の確認
redis-cli で --scan オプションを指定して、次の SCAN コマンドを実行します。コマンドが一致するキーを返さないことを確認します。
# 一致するキーの数をカウントします。期待される結果は 0 です。
redis-cli -h <host> -p <port> -a <password> --scan --pattern 'test:*' | wc -l