这段只能单机或主从模式下使用,集群下报错:ERR for redis cluster, eval/evalsha number of keys can't be negative or zero
时间: 2024-02-27 11:52:38 浏览: 267
非常抱歉,之前的回答是有误的,确实不能在 Redis 集群中使用 `EVAL` 命令进行模糊匹配并删除。在 Redis 集群中,由于键分散在多个节点上,使用 `keys` 命令查找键名时会扫描整个集群,性能较差,而且在集群模式下,`EVAL` 命令不能跨分片执行,因此会报错。
要在 Redis 集群中进行模糊匹配并删除,可以使用以下方法:
1. 遍历所有节点
首先,需要遍历 Redis 集群中的所有节点,使用 `CLUSTER NODES` 命令可以查看所有节点的信息,例如:
```
CLUSTER NODES
```
该命令会返回所有节点的信息,格式如下:
```
e72e1a4e5ff3d1041ba743a732b7ef2d7ae94be6 127.0.0.1:7001@17001 myself,master - 0 0 1 connected 0-5461
```
其中,第二列是节点的地址和端口,例如 `127.0.0.1:7001`。
2. 在每个节点上执行 DEL 命令
遍历所有节点后,可以在每个节点上执行 `DEL` 命令,删除匹配的键名。例如,要删除键名中包含 `mykey` 的所有键,可以在每个节点上执行以下命令:
```
redis-cli -h <host> -p <port> KEYS *mykey* | xargs redis-cli -h <host> -p <port> DEL
```
其中,`<host>` 和 `<port>` 分别是节点的地址和端口,`KEYS *mykey*` 用于查找匹配的键名列表,`xargs` 命令用于将键名列表作为参数传递给 `DEL` 命令,最终删除所有匹配的键。
需要注意的是,在集群模式下,每个节点上只能删除属于该节点的键,因此需要在所有节点上执行以上命令。
总的来说,这种方法比较麻烦,需要手动遍历所有节点,并且需要在所有节点上执行删除命令。如果需要在 Redis 集群中频繁进行模糊匹配并删除操作,建议重新设计键的命名方式,避免使用模糊匹配的方式。
阅读全文