指定されたキーを一括削除するには、Redis の UNLINK コマンドを Linux の cat コマンドおよび xargs コマンドと組み合わせて使用します。パターンに一致するキーを一括削除するには、Redis の SCAN コマンドと UNLINK コマンドを使用します。
注意事項
キーを削除する前にデータをバックアップし、オフピーク時間帯に削除操作を実行してください。
このトピックの例は、Elastic Compute Service (ECS) インスタンスまたはローカルマシン上の redis-cli や Python クライアントなどのクライアントから実行してください。これらの例は DMS では実行できません。
指定されたキーの一括削除
コマンドを実行する前に、削除するキーのリストをファイルに書き込みます。
次のコマンドは、指定されたファイルから各行を Redis キーとして読み取り、redis-cli を使用して Redis サーバーに接続し、UNLINK コマンドを使用してキーを削除します。
# 非同期の UNLINK コマンド (Redis 4.0 以降) を使用してブロックを回避します。ご利用の Redis のバージョンが 4.0 より前の場合は、UNLINK を DEL に置き換えてください。
cat <file> | xargs redis-cli -h <host> -p <port> -a <password> UNLINKLinux の 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 を使用したあいまい削除 | 本番環境で大量のデータを安全に削除します。このメソッドは非ブロッキングであり、オンラインサービスの安定性を確保します。 |
パイプラインモードでの高スループットなあいまい削除 | 多くのコマンドを単一のバッチで送信することで、スループットを最大化し、ネットワーク遅延を削減します。この方法は、最大限の削除効率が求められるシナリオに最適です。 |
KEYS と DEL を使用したあいまい削除 | 開発環境やステージング環境、または完全なサービス停止中に少量のデータを削除します。KEYS コマンドはサーバーをブロックするため、本番環境での使用は非常に危険です。 |
(推奨) SCAN と UNLINK を使用したあいまい削除
このメソッドは、パターンに一致するキーを繰り返しスキャンして削除します。以下は 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)scan_and_unlink.py サンプルコードを呼び出し、Redis インスタンスの接続情報とキーのマッチングパターンを指定して、あいまい一致に基づいてキーを削除します。
python scan_and_unlink.py <host> <port> <password> "<key>" パラメーターの説明:
host:Redis インスタンスのエンドポイント。詳細については、エンドポイントの表示をご参照ください。
port:Redis インスタンスのポート番号。デフォルト値は 6379 です。
password:Redis インスタンスのパスワード。詳細については、ログオン方法をご参照ください。
key:データベース内のキーに一致させるためのパターン。例えば、
"test*"は、test1、test2、test3のように、test プレフィックスを持つキーに一致します。ワイルドカード文字のマッチングに関する詳細情報:
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) が大幅に削減されます。以下は 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]) # port を整数に変換
password = argv[3]
match = argv[4]
print(f"host: {host}, port: {port}, password: {'*' * len(password)}, match: {match}\n")
# 1000 個のキーを蓄積した後、パイプラインを介して 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)
前述の scan_and_unlink_pipe.py サンプルコードを実行し、Redis インスタンスの接続情報とキーのマッチングパターンを指定して、あいまい一致に基づいてキーを削除します。
python scan_and_unlink_pipe.py <host> <port> <password> "<key>" パラメーターの説明:
host:Redis インスタンスのエンドポイント。詳細については、エンドポイントの表示をご参照ください。
port:Redis インスタンスのポート番号。デフォルト値は 6379 です。
password:Redis インスタンスのパスワード。詳細については、ログオン方法をご参照ください。
key:データベース内のキーに一致させるためのパターン。例えば、
"test*"は、test1、test2、test3のように、test プレフィックスを持つキーに一致します。ワイルドカード文字のマッチングに関する詳細情報:
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 に一致します。
KEYS と DEL を使用したあいまい削除
KEYS コマンドを使用すると、CPU 使用率が高くなる可能性があります。この操作はオフピーク時間帯に実行してください。
キーが多数存在するデータベースで KEYS コマンドを使用すると、パフォーマンスに影響を与える可能性があります。このコマンドは、キーの数が少ないデータベースでのみ使用してください。
次のコマンドを実行して、ワイルドカードパターンを持つ KEYS コマンドですべての一致するキーを検索し、それらをパイプで DEL コマンドに渡して削除します。
redis-cli -h <host> -p <port> -a <password> KEYS "<key>" | xargs redis-cli -h <host> -p <port> -a <password> DELパラメーターの説明:
host:Redis インスタンスのエンドポイント。詳細については、エンドポイントの表示をご参照ください。
port:Redis インスタンスのポート番号。デフォルト値は 6379 です。
password:Redis インスタンスのパスワード。詳細については、ログオン方法をご参照ください。
key:データベース内のキーに一致させるためのパターン。例えば、
"test*"は、test1、test2、test3のように、test プレフィックスを持つキーに一致します。ワイルドカード文字のマッチングに関する詳細情報:
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 に一致します。
例:
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キーが削除されたことの確認
SCAN コマンドを再度実行して、一致するキーが返されないことを確認します。
# 一致するキーの数をカウントします。期待される結果は 0 です。
redis-cli -h <host> -p <port> -a <password> --scan --pattern 'test:*' | wc -l