如何在Redis群集中删除与模式匹配的键

时间:2018-12-11 01:46:46

标签: redis redis-cluster

我在此question中尝试过方法,但是由于我在集群模式下工作,因此该方法不起作用,并且redis告诉我:

  

(错误)CROSSSLOT请求中的键未哈希到同一插槽

2 个答案:

答案 0 :(得分:4)

question的答案尝试删除单个DEL中的多个键。但是,与给定模式匹配的键可能不会位于同一插槽中,并且如果这些键不属于同一插槽,则Redis Cluster不支持多键命令。这就是为什么您收到错误消息的原因。

为了解决此问题,您需要DEL一对一的密钥:

redis-cli --scan --pattern "foo*" |xargs -L 1 redis-cli del

-L命令的xargs选项指定要删除的密钥数。您需要将此选项指定为1

为了删除所有与模式匹配的键,还需要对集群中的每个主节点运行上述命令。

注意

  1. 使用此命令,您必须一个一个地删除这些键,这可能会很慢。您需要考虑重新设计数据库,并使用 hash-tags 使与模式匹配的键属于同一插槽。这样您就可以在单个DEL中删除这些键。

  2. SCANKEYS命令效率低下,尤其是,KEYS不应在生产中使用。您需要考虑为这些键建立索引。

答案 1 :(得分:0)

for_stack's answer 为基础,您可以使用 redis-cli --pipe 大大加快批量删除的速度,如果您使用的是 UNLINK 而不是 DEL,则可以降低性能影响redis 4 或更高版本。

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 的输出来进一步自动化该过程。