Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Redis Cluster中删除与模式匹配的密钥_Redis_Redis Cluster - Fatal编程技术网

如何在Redis Cluster中删除与模式匹配的密钥

如何在Redis Cluster中删除与模式匹配的密钥,redis,redis-cluster,Redis,Redis Cluster,我尝试过这种方法,但它不起作用,因为我在集群模式下工作,redis告诉我: (错误)请求中的交叉插槽键未散列到同一插槽 答案是尝试在一个DEL中删除多个键。但是,与给定模式匹配的密钥可能不在同一插槽中,并且如果这些密钥不属于同一插槽,Redis Cluster不支持多个密钥命令。这就是为什么您会收到错误消息 要解决此问题,您需要逐个DEL这些键: redis-cli --scan --pattern "foo*" |xargs -L 1 redis-cli del xargs命令的-L选项指定

我尝试过这种方法,但它不起作用,因为我在集群模式下工作,redis告诉我:

(错误)请求中的交叉插槽键未散列到同一插槽

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

要解决此问题,您需要逐个
DEL
这些键:

redis-cli --scan --pattern "foo*" |xargs -L 1 redis-cli del
xargs
命令的
-L
选项指定要删除的键数。您需要将此选项指定为
1

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

注意

  • 使用此命令,您必须逐个删除这些键,这可能会非常缓慢。您需要考虑重新设计数据库,并使用<强>散列标签< /强>使键与属于同一时隙的模式相匹配。这样您就可以在单个
    DEL
    中删除这些键

  • 无论是
    扫描
    还是
    命令都效率低下,尤其是
    不应在生产中使用。您需要考虑为这些键建立索引。

  • 在此基础上,如果您使用的是redis 4或更高版本,您可以使用
    redis cli--pipe
    ,大大加快批量删除的速度,并使用而不是
    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
    

    您仍然需要对集群中的每个主节点运行此操作。如果您有大量节点,则可能通过解析的输出进一步自动化该过程。

    一些人建议使用Eval作为选项;但是我还没有找到一个使用Eval的好例子。有线索吗?一些golang redis客户端库的示例会更好。我得到
    (错误)请求中的交叉插槽键不会散列到同一插槽
    我正在使用以下命令删除模式
    hi*
    表单集群
    redis cli-uredis://localhost:6379  --扫描--模式“hi*”| xargs redis cli-uredis://localhost:6379 正如我在回答中提到的那样,您需要为
    xargs
    命令指定
    -L 1
    参数