1. 程式人生 > 資料庫 >批量刪除redis的key

批量刪除redis的key

專案中某個redis的key下面有幾十萬條資料,用rdm工具刪能卡死,於是用python寫了一個指令碼來刪,效果非常不錯,推薦給大家。
舉個例子com:uecent:udata:climb下面有幾十萬條資料,比如
com:uecent:udata:climb:1000001
com:uecent:udata:climb:1000001
com:uecent:udata:climb:1000003

執行命令:
python3 redis_delete.py -d 2 -k com:uecent:udata:climb
-d 2:表示刪除redis第2個數據庫,可以指定0-15
-k:表示刪除的key字首

可以本地執行,也可以放到伺服器上執行。建議拿到伺服器上執行,本地執行估計比較慢。

拿到伺服器上執行貌似也可以用redis客戶端:redis-cli keys “com:uecent:udata:climb*” | xargs redis-cli del,不過還是感覺我這個指令碼更方便,特別是裝在docker容器裡面的,或者沒有許可權登陸伺服器的。

redis_delete.py

# -*- coding:UTF-8 -*-
import redis
import sys
import getopt
 
host = '127.0.0.1'
port = '6379'
password = 'xxxxxxxx'
 
def delete(key,database):
    r = redis.Redis(host=host,port=port,db=database,password=password,decode_responses=True)
    list_keys = r.keys("%s*" % key)
 
    for key in list_keys:
        r.delete(key)
 
if __name__ == "__main__":
    root_path = ""
    is_rename = True
 
    argv = sys.argv[1:]
    if len(argv) < 1:
        print('redis_delete.py -k <Key> -d <Database>')
        sys.exit()
 
    # 獲取命令列引數
    try:
        opts,args = getopt.getopt(argv,"hk:d:",["kKey=","dDatabase="])
    except getopt.GetoptError:
        print('redis_delete.py -k <Key> -d <Database>')
        sys.exit(2)
 
    for opt,arg in opts:
        if opt == '-h':
            print('redis_delete.py -k <Key> -d <Database>')
            sys.exit()
        elif opt in ("-k","--kKey"):
            key = arg
        elif opt in ("-d","--dDatabase"):
            database = arg
    delete(key,int(database))