项目中某个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 redisimport sysimport 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))