You need to enable JavaScript to run this app.
导航
批量删除 key
最近更新时间:2025.03.25 17:52:27首次发布时间:2025.03.05 14:08:08
我的收藏
有用
有用
无用
无用

Redis 提供了 DEL 命令来删除单个 key。当需要批量删除多个 key 时,您可以在 Lua 脚本中将 Linux 的 cat 和 xargs 命令与 Redis 的 DEL 命令组合使用来精确匹配批量删除 key;或者将 Redis 的 SCAN、RANDOMKEY、KEYS 或 FLUSHALL 与 DEL 命令组合使用来模糊匹配批量删除 key。

精确匹配批量删除 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 实例,其中:

  • host: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) < 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"

命令语法中各参数说明如下表所示。

命令参数说明
hostRedis 的实例连接地址。更多信息,请参见查看连接地址
portRedis 实例连接地址的端口号。更多信息,请参见查看连接地址
passwordRedis 实例中默认账号 default 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码

match_key

符合指定条件的 key。例如 "del*" 表示所有以 del 为前缀的 key,例如 del_adel1delOK 等。

说明

如下是通配符匹配的更多说明供您参考:

  • r?dis:可匹配以 r 开头,以 dis 结尾,且长度为 5 个字符的字符串,例如 redisradisridis 等。
  • r*dis:可匹配以 r 开头,以 dis 结尾的任意长度的字符串,例如 rdisreeeeedis 等。
  • r[ae]dis:仅匹配 radisredis,但不匹配 ridis 等。
  • r[^e]dis:可匹配 radisridis 等,但不匹配 redis
  • r[a-z]dis:可匹配以 r 开头,以 dis 结尾,且第 2 位字符为从 a 到 z 中任意字母的字符串,例如 radisrbdisrzdis 等。

命令示例如下。

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

命令语法中各参数说明如下表所示。

命令参数说明
hostRedis 的实例连接地址。更多信息,请参见查看连接地址
passwordRedis 实例中默认账号 default 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码

match_key

符合指定条件的 key。例如 "del*" 表示所有以 del 为前缀的 key,例如 del_adel1delOK 等。

说明

如下是通配符匹配的更多说明供您参考:

  • r?dis:可匹配以 r 开头,以 dis 结尾,且长度为 5 个字符的字符串,例如 redisradisridis 等。
  • r*dis:可匹配以 r 开头,以 dis 结尾的任意长度的字符串,例如 rdisreeeeedis 等。
  • r[ae]dis:仅匹配 radisredis,但不匹配 ridis 等。
  • r[^e]dis:可匹配 radisridis 等,但不匹配 redis
  • r[a-z]dis:可匹配以 r 开头,以 dis 结尾,且第 2 位字符为从 a 到 z 中任意字母的字符串,例如 radisrbdisrzdis 等。

命令示例如下。

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 命令中的 WITHPATTERNWITHOUTPATTERN 参数模糊匹配所有符合条件的 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>"
    

命令语法中各参数说明如下表所示。

命令参数说明
hostRedis 的实例连接地址。更多信息,请参见查看连接地址
passwordRedis 实例中默认账号 default 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码

match_key

符合指定条件的 key。例如 "del*" 表示所有以 del 为前缀的 key,例如 del_adel1delOK 等。

说明

如下是通配符匹配的更多说明供您参考:

  • r?dis:可匹配以 r 开头,以 dis 结尾,且长度为 5 个字符的字符串,例如 redisradisridis 等。
  • r*dis:可匹配以 r 开头,以 dis 结尾的任意长度的字符串,例如 rdisreeeeedis 等。
  • r[ae]dis:仅匹配 radisredis,但不匹配 ridis 等。
  • r[^e]dis:可匹配 radisridis 等,但不匹配 redis
  • r[a-z]dis:可匹配以 r 开头,以 dis 结尾,且第 2 位字符为从 a 到 z 中任意字母的字符串,例如 radisrbdisrzdis 等。

命令示例如下:

  • 删除符合匹配规则的所有 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 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>" 

命令语法中各参数说明如下表所示。

命令参数说明
hostRedis 的实例连接地址。更多信息,请参见查看连接地址
portRedis 实例连接地址的端口号。更多信息,请参见查看连接地址
passwordRedis 实例中默认账号 default 的登录密码。如果忘记密码,您可以重置密码。具体操作,请参见重置密码

match_key

符合指定条件的 key。例如 "del*" 表示所有以 del 为前缀的 key,例如 del_adel1delOK 等。

说明

如下是通配符匹配的更多说明供您参考:

  • r?dis:可匹配以 r 开头,以 dis 结尾,且长度为 5 个字符的字符串,例如 redisradisridis 等。
  • r*dis:可匹配以 r 开头,以 dis 结尾的任意长度的字符串,例如 rdisreeeeedis 等。
  • r[ae]dis:仅匹配 radisredis,但不匹配 ridis 等。
  • r[^e]dis:可匹配 radisridis 等,但不匹配 redis
  • r[a-z]dis:可匹配以 r 开头,以 dis 结尾,且第 2 位字符为从 a 到 z 中任意字母的字符串,例如 radisrbdisrzdis 等。

命令示例如下。

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**** "test_del"

若返回结果为 empty array 表示 Redis 中不存在该 key,即该 key 已被成功删除。