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

Posted

技术标签:

【中文标题】如何删除与 Redis 集群中的模式匹配的键【英文标题】:How to delete keys matching a pattern in Redis Cluster 【发布时间】:2019-05-11 23:25:45 【问题描述】:

我已经尝试过这个question中的方法,但是由于我在集群模式下工作,它不起作用,redis告诉我:

(错误)CROSSSLOT 请求中的密钥不散列到同一个槽

【问题讨论】:

有些人建议使用 Eval 作为选项;但我找不到使用 Eval 的好例子。有什么线索吗?一些 golang redis-client 库的示例会更好。 【参考方案1】:

question 的答案尝试删除单个 DEL 中的多个键。但是,匹配给定模式的键可能不在同一个槽中,如果这些键不属于同一个槽,Redis 集群不支持多键命令。这就是您收到错误消息的原因。

为了解决这个问题,你需要DEL这些键一一对应:

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

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

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

注意

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

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

【讨论】:

我得到(error) CROSSSLOT Keys in request don't hash to the same slot 我正在使用以下删除模式hi* 形成集群redis-cli -u redis://localhost:6379 --scan --pattern 'hi*' | xargs redis-cli -u redis://localhost:6379 DEL @roottraveller 正如我在答案中提到的,您需要为xargs 命令指定-L 1 参数【参考方案2】:

在for_stack's answer 的基础上,您可以使用redis-cli --pipe 加快批量删除速度,如果您使用的是redis 4 或更高版本,则可以使用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 集群中的模式匹配的键的主要内容,如果未能解决你的问题,请参考以下文章

如何从redis-cli repl中删除Redis匹配模式中的所有键?

如何使用纯 Redis 原子地删除数百万个匹配模式的键?

如何计算匹配模式的键数?

redis 怎样查找一个key?

redis 怎样查找一个key?

Redis 查找匹配字符串的模式键