You need to enable JavaScript to run this app.
文档中心
缓存数据库 Redis 版

缓存数据库 Redis 版

复制全文
下载 pdf
开发参考(数据面)
批量删除 key
复制全文
下载 pdf
批量删除 key
Redis 提供了 DEL 命令来删除单个 key。当需要批量删除多个 key 时,您可以将 Linux 的 cat 和 xargs 命令与 Redis 的 DEL 命令组合使用来精确匹配批量删除 key;或者将 Redis 的 SCAN、RANDOMKEY、KEYS 或 FLUSHALL 与 DEL 命令组合使用来模糊匹配批量删除 key。​
警告​
  • DEL、FLUSHALL 等命令执行后立即删除数据,操作不可逆,误删的数据无法恢复,请谨慎操作。​
  • 批量删除前,建议先执行手动备份,并确认待删除的 key 范围(可先使用 SCAN 或 KEYS 预览匹配结果)。具体操作,请参见手动备份。​
  • 建议先在测试环境验证匹配规则无误后,再在生产环境执行,并优先选择业务低峰期操作。​
精确匹配批量删除 key​
您可以参考如下命令语法在 Lua 脚本中将 Linux 的 cat 和 xargs 命令与 Redis 的 DEL 命令组合使用来精确匹配批量删除 key。​
​
cat <file> | xargs redis-cli -h <host> -a <password> DEL​
​
命令语法中各参数说明如下表所示。​
​
参数​
说明​
cat <file>​
通过 cat 命令从文件中读取每一行作为 Redis 的 key, 其中 <file> 为待删除 key 的文件路径,例如 del_key.txt。​
说明​
在执行上述命令前,请将需要删除的 key 列表写入上述指定文件中。​
xargs​
通过 xargs 命令将参数列表分段传递给其他命令,避免参数列表过长的问题。xargs 命令可以单独使用,也可以通过管道符、重定位符等与其他命令配合使用。​
说明​
在使用 xargs 命令时,若文件中存在特殊字符可能需要进行转义处理,否则可能会出现与预期不一致的结果。​
redis-cli -h <host> -a <password>​
通过 redis-cli 工具连接到 Redis 实例,其中:​
  • password:Redis 实例中默认账号 default 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码。​
DEL​
使用 DEL 命令删除指定文件中所记录的 key。​
​
命令示例如下。​
​
cat del_key.txt | xargs redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** DEL​
​
模糊匹配批量删除 key​
您可以将 Redis 的 SCAN、RANDOMKEY、KEYS 或 FLUSHALL 命令与 DEL 命令组合使用来模糊匹配批量删除 key。​
(推荐)通过 SCAN 和 DEL 命令模糊批量删除​
在 Python 代码中组合使用 SCAN 和 DEL 命令,来循环遍历并删除符合条件的 key。示例代码如下所示。​
​
import redis​
import sys​
​
def main(argv):​
​
if len(argv) < 5:​
print("Usage: python scan_del.py <host> <port> <password> <match>")​
exit(1)​
​
host = argv[1]​
port = argv[2]​
password = argv[3]​
match = argv[4]​
print("host: %s, port: %s, password: ********, match: %s\n" % (host, port, 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 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码。​
match_key​
符合指定条件的 key。例如 "del*" 表示所有以 del 为前缀的 key,例如 del_a、del1、delOK 等。​
说明​
如下是通配符匹配的更多说明供您参考:​
  • r?dis:可匹配以 r 开头,以 dis 结尾,且长度为 5 个字符的字符串,例如 redis,radis 和 ridis 等。​
  • r*dis:可匹配以 r 开头,以 dis 结尾的任意长度的字符串,例如 rdis 和 reeeeedis 等。​
  • r[ae]dis:仅匹配 radis 和 redis,但不匹配 ridis 等。​
  • r[^e]dis:可匹配 radis 和 ridis 等,但不匹配 redis。​
  • r[a-z]dis:可匹配以 r 开头,以 dis 结尾,且第 2 位字符为从 a 到 z 中任意字母的字符串,例如 radis、rbdis 和 rzdis 等。​
​
命令示例如下。​
​
python scan_del.py redis-cng6qap*****.redis.ivolces.com 6397 Pwd@123**** "del*"​
​
通过 KEYS 和 DEL 命令模糊批量删除​
警告​
  • KEYS 命令是一个阻塞式的操作,当 key 数量非常多时,可能会导致实例 CPU 使用率高甚至服务器阻塞。不建议在直接生产环境中使用,如需在生产环境中使用,强烈建议在数据较少时或业务低峰期操作。​
  • 缓存数据库 Redis 版默认禁用了 KEYS 命令。如需使用该命令,需将对应的命令从禁用命令参数的默认值中移除。否则执行这些禁用命令时,会出现 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 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码。​
match_key​
符合指定条件的 key。例如 "del*" 表示所有以 del 为前缀的 key,例如 del_a、del1、delOK 等。​
说明​
如下是通配符匹配的更多说明供您参考:​
  • r?dis:可匹配以 r 开头,以 dis 结尾,且长度为 5 个字符的字符串,例如 redis,radis 和 ridis 等。​
  • r*dis:可匹配以 r 开头,以 dis 结尾的任意长度的字符串,例如 rdis 和 reeeeedis 等。​
  • r[ae]dis:仅匹配 radis 和 redis,但不匹配 ridis 等。​
  • r[^e]dis:可匹配 radis 和 ridis 等,但不匹配 redis。​
  • r[a-z]dis:可匹配以 r 开头,以 dis 结尾,且第 2 位字符为从 a 到 z 中任意字母的字符串,例如 radis、rbdis 和 rzdis 等。​
​
命令示例如下。​
​
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​
​
通过 FLUSHALL 参数和 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 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码。​
match_key​
符合指定条件的 key。例如 "del*" 表示所有以 del 为前缀的 key,例如 del_a、del1、delOK 等。​
说明​
如下是通配符匹配的更多说明供您参考:​
  • r?dis:可匹配以 r 开头,以 dis 结尾,且长度为 5 个字符的字符串,例如 redis,radis 和 ridis 等。​
  • r*dis:可匹配以 r 开头,以 dis 结尾的任意长度的字符串,例如 rdis 和 reeeeedis 等。​
  • r[ae]dis:仅匹配 radis 和 redis,但不匹配 ridis 等。​
  • r[^e]dis:可匹配 radis 和 ridis 等,但不匹配 redis。​
  • r[a-z]dis:可匹配以 r 开头,以 dis 结尾,且第 2 位字符为从 a 到 z 中任意字母的字符串,例如 radis、rbdis 和 rzdis 等。​
​
命令示例如下:​
  • 删除符合匹配规则的所有 key​
  • ​
    redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** FLUSHALL WITHPATTERN "*yesdel"​
    ​
  • 删除匹配规则之外的所有 key​
  • ​
    redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** FLUSHALL WITHOUTPATTERN "*nodel"​
    ​
通过 RANDOMKEY 和 DEL 低频模糊批量删除​
警告​
  • 因为 RANDOMKEY 是完全随机获取 key,可能需要多次获取才能找到符合匹配规则的 key。这种方法效率较低,适用于低频模糊批量删除 key 的业务场景。​
  • 当 Redis 中的 key 数量非常大且符合匹配规则的 key 比例较小时,整个命令执行过程可能会比较耗时。​
  • 已启用分片集群的 Redis 实例在执行 RANDOMKEY 命令时,会采用轮询方式来访问各分片,即 Redis 会将 RANDOMKEY 命令请求发往每一个分片,当访问的分片不存在符合条件的 key 时就返回 nil,该返回结果仅表示在当前分片上没有找到符合条件的 key,不代表在其他分片上没有符合条件的 key。因此建议在使用 RANDOMKEY 命令时,不要依据返回结果是否为 nil 来判定是否存在符合条件的 key。​
在 Python 代码中组合使用 RANDOMKEY 和 DEL 命令来低频模糊批量删除 key,即通过多次随机获取 key 并判断其是否符合匹配规则进行删除。示例代码如下所示。​
​
import sys​
import time​
import redis​
import fnmatch​
​
​
def main(argv):​
if len(argv) < 5:​
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: ********, match: %s\n" % (host, port, 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 fnmatch.fnmatch(random_key.decode('utf-8'), match):​
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 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码。​
match_key​
符合指定条件的 key。例如 "del*" 表示所有以 del 为前缀的 key,例如 del_a、del1、delOK 等。​
说明​
如下是通配符匹配的更多说明供您参考:​
  • r?dis:可匹配以 r 开头,以 dis 结尾,且长度为 5 个字符的字符串,例如 redis,radis 和 ridis 等。​
  • r*dis:可匹配以 r 开头,以 dis 结尾的任意长度的字符串,例如 rdis 和 reeeeedis 等。​
  • r[ae]dis:仅匹配 radis 和 redis,但不匹配 ridis 等。​
  • r[^e]dis:可匹配 radis 和 ridis 等,但不匹配 redis。​
  • r[a-z]dis:可匹配以 r 开头,以 dis 结尾,且第 2 位字符为从 a 到 z 中任意字母的字符串,例如 radis、rbdis 和 rzdis 等。​
​
命令示例如下。​
​
python randomkey_del_low_frequency.py redis-cng6qap*****.redis.ivolces.com 6397 Pwd@123**** "del*"​
​
验证指定 Key 是否删除成功​
您可以通过如下命令检查指定 key 是否已成功删除。​
​
redis-cli -h <host> -a <password> KEYS "<key>"​
​
命令示例如下。​
​
redis-cli -h redis-cng6qap*****.redis.ivolces.com -a Pwd@123**** KEYS "test_del"​
​
若返回结果为 empty array 表示 Redis 中不存在该 key,即该 key 已被成功删除。​
​
最近更新时间:2026.10.27 11:01:43
这个页面对您有帮助吗?
有用
有用
无用
无用