すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):キーの一括削除

最終更新日:Sep 19, 2025

この Topic では、Redis で指定されたキーまたはパターンに一致するキーを一括削除する方法を示します。

注意事項

  • キーを削除する前にデータをバックアップし、オフピーク時に削除を実行してください

  • この Topic の例は、インスタンスに接続されたクライアント (redis-cli または Python) から実行する必要があります。Data Management (DMS) では実行できません。

指定されたキーの一括削除

  1. 削除するキーを、1 行に 1 つのキーの形式でテキストファイルに保存します。

  2. 次のコマンドを実行して、指定されたキーを削除します:

    # ブロッキングを避けるために非同期の 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

パターンに一致するキーの一括削除

次の表のメソッドを使用して、共通のプレフィックスやサフィックスを持つキーなど、パターンに一致するキーを一括削除します。

メソッド

ユースケース

(推奨) SCANUNLINK を使用

本番環境で大量のデータを安全に削除します。このメソッドはノンブロッキングであり、オンラインサービスの安定性を確保します。

高スループット削除のためにパイプラインモードを使用

コマンドをバッチで実行してスループットを最大化し、ネットワーク遅延を削減します。このメソッドは、最大の削除効率が要求されるシナリオに最適です。

KEYSDEL を使用

開発環境またはテスト環境、あるいは完全なサービス停止中に少量のデータを削除します。KEYS コマンドはサーバーをブロックするため、本番環境での使用は非常に危険です。

(推奨) SCANUNLINK を使用

このメソッドは、特定のパターンに一致するキーを繰り返しスキャンして削除します。

  1. 次のコードを 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)
  2. 次のコマンドを実行してスクリプトを実行します:

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

    パラメーター:

    • host: Redis インスタンスのエンドポイント

    • port: Redis インスタンスのポート番号。デフォルト値: 6379。

    • password: Redis インスタンスへの接続に使用するパスワード。詳細については、「インスタンスに接続する」をご参照ください。

    • key: 削除したいキーに一致させるために使用するパターン。たとえば、"test*" は、test プレフィックスを持つすべてのキーに一致します。例: test1test2test3

      次の例は、パターンマッチングにワイルドカードを使用する方法を示しています:

      • w?rld: w で始まり、rld で終わる 5 文字の文字列 (worldwarldwxrld など) に一致します。

      • w*rld: w で始まり、rld で終わる任意の文字列に一致します。たとえば wrldwoooorld などです。

      • w[ae]rld: warldwerld には一致しますが、world には一致しません。

      • w[^e]rld: worldwarld には一致しますが、werld には一致しません。

      • w[a-b]rld: warldwbrld に一致します。

高スループット削除のためにパイプラインモードを使用

このメソッドは、特定のパターンに一致するキーを繰り返しスキャンし、パイプラインを使用して UNLINK コマンドをバッチで送信します。このアプローチにより、ラウンドトリップタイム (RTT) が大幅に削減されます。

  1. 次のコードを 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)
    
  2. 次のコマンドを実行してスクリプトを実行します:

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

    パラメーター:

    • host: Redis インスタンスのエンドポイント

    • port: Redis インスタンスのポート番号。デフォルト値: 6379。

    • password: Redis インスタンスへの接続に使用するパスワード。詳細については、「インスタンスに接続する」をご参照ください。

    • key: 削除したいキーに一致させるために使用するパターン。たとえば、"test*" は、test プレフィックスを持つすべてのキーに一致します。例: test1test2test3

      次の例は、パターンマッチングにワイルドカードを使用する方法を示しています:

      • w?rld: w で始まり rld で終わる、worldwarldwxrld などの 5 文字の文字列に一致します。

      • w*rld: w で始まり rld で終わる文字列に一致します。たとえば、wrldwoooorld などです。

      • w[ae]rld: warldwerld には一致しますが、world には一致しません。

      • w[^e]rld: worldwarld には一致しますが、werld には一致しません。

      • w[a-b]rld: warldwbrld に一致します。

KEYSDEL を使用

警告

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 プレフィックスを持つすべてのキーに一致します。例: test1test2test3

    次の例は、パターンマッチングにワイルドカードを使用する方法を示しています:

    • w?rld: w で始まり、rld で終わる、worldwarldwxrld などの 5 文字の文字列に一致します。

    • w*rld: w で始まり rld で終わる、wrldwoooorld などの任意の文字列に一致します。

    • w[ae]rld: warldwerld には一致しますが、world には一致しません。

    • w[^e]rld: worldwarld には一致しますが、werld には一致しません。

    • w[a-b]rld: warldwbrld に一致します。

コマンドの例:

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