Redis 提供了 DEL 命令来删除单个 key。当需要批量删除多个 key 时,您可以在 Lua 脚本中将 Linux 的 cat 和 xargs 命令与 Redis 的 DEL 命令组合使用来精确匹配批量删除 key;或者将 Redis 的 SCAN、RANDOMKEY、KEYS 或 FLUSHALL 与 DEL 命令组合使用来模糊匹配批量删除 key。
您可以参考如下命令语法在 Lua 脚本中将 Linux 的 cat 和 xargs 命令与 Redis 的 DEL 命令组合使用来精确匹配批量删除 key。
cat <file> | xargs redis-cli -h <host> -a <password> DEL
命令语法中各参数说明如下表所示。
命令参数 | 说明 |
---|---|
| 通过 cat 命令从文件中读取每一行作为 Redis 的 key, 其中 说明 在执行上述命令前,请将需要删除的 key 列表写入上述指定文件中。 |
| 通过 xargs 命令将参数列表分段传递给其他命令,避免参数列表过长的问题。xargs 命令可以单独使用,也可以通过管道符、重定位符等与其他命令配合使用。 说明 在使用 xargs 命令时,若文件中存在特殊字符可能需要进行转义处理,否则可能会出现与预期不一致的结果。 |
| 通过 redis-cli 工具连接到 Redis 实例,其中: |
DEL | 使用 DEL 命令删除指定文件中所记录的 key。 |
命令示例如下。
cat del_key.txt | xargs redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** DEL
您可以将 Redis 的 SCAN、RANDOMKEY、KEYS 或 FLUSHALL 命令与 DEL 命令组合使用来模糊匹配批量删除 key。
在 Python 代码中组合使用 SCAN 和 DEL 命令,来循环遍历并删除符合条件的 key。示例代码如下所示。
import redis import sys def main(argv): if len(argv) < 4: print("Usage: python scan_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_del.py
,调用时需指定 Redis 实例的连接信息和 key 的匹配规则,即可实现模糊匹配批量删除符合条件的 key。
python scan_del.py <host> <port> <password> "match_key"
命令语法中各参数说明如下表所示。
命令参数 | 说明 |
---|---|
host | Redis 的实例连接地址。更多信息,请参见查看连接地址。 |
port | Redis 实例连接地址的端口号。更多信息,请参见查看连接地址。 |
password | Redis 实例中默认账号 default 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码。 |
| 符合指定条件的 key。例如 说明 如下是通配符匹配的更多说明供您参考:
|
命令示例如下。
python scan_del.py redis-cng6qap*****.redis.ivolces.com 6397 Pwd@123**** "del*"
警告
no permission to execute the command
的报错。参数修改方法,请参见设置实例参数。组合使用 KEYS 和 DEL 命令模糊匹配批量删除符合条件的 key, 即先通过 KEYS 命令中的通配符模糊匹配所有符合条件的 key,再通过 DEL 命令删除这些 key。命令语法如下。
redis-cli -h <host> -a <password> KEYS "<match_key>" | xargs redis-cli -h <host> -a <password> DEL
命令语法中各参数说明如下表所示。
命令参数 | 说明 |
---|---|
host | Redis 的实例连接地址。更多信息,请参见查看连接地址。 |
password | Redis 实例中默认账号 default 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码。 |
| 符合指定条件的 key。例如 说明 如下是通配符匹配的更多说明供您参考:
|
命令示例如下。
redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** KEYS "del*" | xargs redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** DEL
警告
缓存数据库 Redis 版默认禁用了 FLUSHALL 命令。 如需使用该命令,需将对应的命令从禁用命令参数的默认值中移除。否则执行这些禁用命令时,会出现 no permission to execute the command
的报错。参数修改方法,请参见设置实例参数。
组合使用 FLUSHALL 和 DEL 命令快速模糊匹配批量删除符合条件的 key, 即先通过 FLUSHALL 命令中的 WITHPATTERN
或 WITHOUTPATTERN
参数模糊匹配所有符合条件的 key,再通过 DEL 命令删除这些 key,或删除这些 key 之外的其他 key。命令语法如下:
删除符合匹配规则的所有 key
redis-cli -h <host> -a <password> FLUSHALL WITHPATTERN "<match_key>"
删除匹配规则之外的所有 key
redis-cli -h <host> -a <password> FLUSHALL WITHOUTPATTERN "<match_key>"
命令语法中各参数说明如下表所示。
命令参数 | 说明 |
---|---|
host | Redis 的实例连接地址。更多信息,请参见查看连接地址。 |
password | Redis 实例中默认账号 default 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码。 |
| 符合指定条件的 key。例如 说明 如下是通配符匹配的更多说明供您参考:
|
命令示例如下:
redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** FLUSHALL WITHPATTERN "*yesdel"
redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** FLUSHALL WITHOUTPATTERN "*nodel"
警告
nil
,该返回结果仅表示在当前分片上没有找到符合条件的 key,不代表在其它分片上没有符合条件的 key。因此建议在使用 RANDOMKEY 命令时,不要依据返回结果是否为 nil
来判定是否存在符合条件的 key。在 Python 代码中组合使用 RANDOMKEY 和 DEL 命令来低频模糊批量删除 key,即通过多次随机获取 key 并判断其是否符合匹配规则进行删除。示例代码如下所示。
import redis import sys import time import re def main(argv): if len(argv) < 4: print("Usage: python randomkey_del_low_frequency.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) rnd = 1 total_deleted = 0 while True: random_key = redis_cli.randomkey() if not random_key: continue if re.match(match, random_key.decode('utf-8')): result = redis_cli.delete(random_key) if result == 1: total_deleted += 1 print("del 1 key in round %d" % rnd) rnd += 1 time.sleep(0.1) if __name__ == '__main__': main(sys.argv)
调用上述示例代码 randomkey_del_low_frequency.py
,调用时需指定 Redis 实例的连接信息和 key 的匹配规则,即可实现模糊匹配批量删除符合条件的 key。
python randomkey_del_low_frequency.py <host> <port> <password> "<match_key>"
命令语法中各参数说明如下表所示。
命令参数 | 说明 |
---|---|
host | Redis 的实例连接地址。更多信息,请参见查看连接地址。 |
port | Redis 实例连接地址的端口号。更多信息,请参见查看连接地址。 |
password | Redis 实例中默认账号 default 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码。 |
| 符合指定条件的 key。例如 说明 如下是通配符匹配的更多说明供您参考:
|
命令示例如下。
python randomkey_del_low_frequency.py redis-cng6qap*****.redis.ivolces.com 6397 Pwd@123**** "del*"
您可以通过如下命令检查指定 key 是否已成功删除。
redis-cli -h <host> -a <password> KEYS "<key>"
命令示例如下。
redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** "test_del"
若返回结果为 empty array
表示 Redis 中不存在该 key,即该 key 已被成功删除。