全部產品
Search
文件中心

Tair (Redis® OSS-Compatible):Tair大量刪除Key

更新時間:Oct 25, 2024

Redis DEL key命令用於刪除單個Key。如需大量刪除Key,可以組合使用Linux的catxargs命令和Redis的DEL命令。如需模糊刪除具有相同首碼或尾碼的Key,推薦使用Redis的SCANDEL命令。

大量刪除指定Key

刪除指定的多個Key

執行命令前,您需要把待刪除的Key列表寫入至檔案。

通過cat命令從指定檔案中讀取每一行作為Redis的Key,然後使用 redis-cli 串連到 Redis 伺服器,並使用DEL命令刪除這些Key。命令文法如下。

cat <file> | xargs redis-cli -h <host> -a <password> DEL
說明

Linux的xargs命令可以將參數列表分段傳遞給其他命令,以避免參數列表過長的問題,可以單獨使用,也可以使用管道符、重定位器等與其他命令配合使用。

參數說明:

  • file:記錄了待刪除Key的檔案路徑。例如key.txt。

  • host:Redis的執行個體串連地址,更多資訊請參見查看串連地址

  • password:Redis執行個體密碼,更多資訊請參見執行個體的登入方式

樣本:

cat key.txt | xargs redis-cli -h r-bp127cu5tb*****.redis.rds.aliyuncs.com -a Test**** DEL

模糊比對刪除Key

方式一(推薦):通過SCAN和DEL命令模糊刪除

通過迴圈逐步遍曆並刪除合格Key。範例程式碼如下所示。

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_del = redis_cli.delete(*ret_keys)
            print("ret_del: %d, ret_keys: %s" % (ret_del, ret_keys))
        cursor = ret_cursor
        rnd += 1
        print("")

if __name__ == '__main__':
    main(sys.argv)

調用上述範例程式碼scan_and_del.py,調用時指定Redis執行個體的串連資訊和Key的匹配模式,即可實現模糊比對刪除。

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

參數說明:

  • host:Redis的執行個體串連地址,更多資訊請參見查看串連地址

  • port:Redis執行個體的連接埠號碼。

  • password:Redis執行個體密碼,更多資訊請參見執行個體的登入方式

  • key:某個資料庫中符合指定要求的Key,例如"test*"標識以test為首碼的Key,如test1test2test3等。

    關於萬用字元匹配的更多說明:

    • w?rld:匹配以w開頭,以rl結尾,且長度為5個字元的字串,例如world,warld和wxrld等。

    • w*rld:匹配以w開頭,以rl結尾的任一字元串,例如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命令,使用萬用字元模糊比對所有合格Key,再通過DEL命令刪除這些Key。

redis-cli -h <host> -a <password> KEYS "<key>" | xargs redis-cli -h <host> -a <password> DEL

參數說明:

  • file:記錄了待刪除Key的檔案路徑。例如key.txt。

  • password:Redis執行個體密碼,更多資訊請參見執行個體的登入方式

  • key:某個資料庫中符合指定要求的Key,例如"test*"標識以test為首碼的Key,如test1test2test3等。

    關於萬用字元匹配的更多說明:

    • w?rld:匹配以w開頭,以rl結尾,且長度為5個字元的字串,例如world,warld和wxrld等。

    • w*rld:匹配以w開頭,以rl結尾的任一字元串,例如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

驗證指定Key是否成功刪除

redis-cli -h <host> -a <password> KEYS "<key>"