如何删除与 Redis 集群中的模式匹配的键
How to delete keys matching a pattern in Redis Cluster
我试过question中的方法,但是因为我在集群模式下工作,所以它不起作用,redis告诉我:
(error) CROSSSLOT Keys in request don't hash to the same slot
该 question 的答案尝试在单个 DEL
中删除多个密钥。然而,匹配给定模式的键可能不在同一个槽中,如果这些键不属于同一个槽,Redis 集群不支持多键命令。这就是您收到错误消息的原因。
为了解决这个问题,您需要 DEL
这些键一个一个地:
redis-cli --scan --pattern "foo*" |xargs -L 1 redis-cli del
xargs
命令的 -L
选项指定要删除的键数。您需要将此选项指定为 1
.
为了删除所有与模式匹配的键,您还需要运行对集群中的每个主节点执行上述命令。
注意
使用这个命令,你必须一个一个地删除这些键,而且这可能会很慢。您需要考虑重新设计您的数据库,并使用 hash-tags 让与模式匹配的键属于同一个槽。这样您就可以一次性删除这些密钥 DEL
.
无论是SCAN
还是KEYS
命令都是低效的,特别是,KEYS
不应该在生产中使用。您需要考虑为这些键建立索引。
如果您使用的是 Redis 4 或更高版本,则基于 , you can speed up mass deletion quite a bit using redis-cli --pipe
, and reduce the performance impact with UNLINK
而不是 DEL
。
redis-cli --scan --pattern "foo*" | xargs -L 1 echo UNLINK | redis-cli --pipe
输出将如下所示:
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 107003
您仍然需要 运行 对集群中的每个主节点执行此操作。如果您有大量节点,则可以通过解析 CLUSTER NODES
.
的输出来进一步自动化该过程
redis-cli
提供了一个 -c
选项来跟随 MOVED
重定向。但是,应该一次删除一个,因为您不能保证两个键在同一个节点中。
redis-cli -h myredis.internal --scan --pattern 'mycachekey::*' | \
xargs -L 1 -d'\n' redis-cli -h myredis.internal -c del
第一部分提供了一个键列表--scan
防止Redis锁定。 xargs -L 1
一次为一个条目运行命令。 -d'\n'
禁用引号处理,因此您可以将 "SimpleKey[hello world]"
之类的带引号的字符串传递给命令,否则空格会使它有两个键。
我试过question中的方法,但是因为我在集群模式下工作,所以它不起作用,redis告诉我:
(error) CROSSSLOT Keys in request don't hash to the same slot
该 question 的答案尝试在单个 DEL
中删除多个密钥。然而,匹配给定模式的键可能不在同一个槽中,如果这些键不属于同一个槽,Redis 集群不支持多键命令。这就是您收到错误消息的原因。
为了解决这个问题,您需要 DEL
这些键一个一个地:
redis-cli --scan --pattern "foo*" |xargs -L 1 redis-cli del
xargs
命令的 -L
选项指定要删除的键数。您需要将此选项指定为 1
.
为了删除所有与模式匹配的键,您还需要运行对集群中的每个主节点执行上述命令。
注意
使用这个命令,你必须一个一个地删除这些键,而且这可能会很慢。您需要考虑重新设计您的数据库,并使用 hash-tags 让与模式匹配的键属于同一个槽。这样您就可以一次性删除这些密钥
DEL
.无论是
SCAN
还是KEYS
命令都是低效的,特别是,KEYS
不应该在生产中使用。您需要考虑为这些键建立索引。
如果您使用的是 Redis 4 或更高版本,则基于 redis-cli --pipe
, and reduce the performance impact with UNLINK
而不是 DEL
。
redis-cli --scan --pattern "foo*" | xargs -L 1 echo UNLINK | redis-cli --pipe
输出将如下所示:
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 107003
您仍然需要 运行 对集群中的每个主节点执行此操作。如果您有大量节点,则可以通过解析 CLUSTER NODES
.
redis-cli
提供了一个 -c
选项来跟随 MOVED
重定向。但是,应该一次删除一个,因为您不能保证两个键在同一个节点中。
redis-cli -h myredis.internal --scan --pattern 'mycachekey::*' | \
xargs -L 1 -d'\n' redis-cli -h myredis.internal -c del
第一部分提供了一个键列表--scan
防止Redis锁定。 xargs -L 1
一次为一个条目运行命令。 -d'\n'
禁用引号处理,因此您可以将 "SimpleKey[hello world]"
之类的带引号的字符串传递给命令,否则空格会使它有两个键。