Redis命令行删除多个键

12

我在CentOS中安装了Redis,我有多个这样的Redis键:

Product:<id>:<url>

如何使用CLI删除所有的Product:*:*

Redis版本:3.2.4 [我猜是最新版]

谢谢!


可能是如何使用Redis原子方式删除匹配模式的键的重复问题。 - Jess Bowers
8个回答

36

使用redis-cli 工具,您可以执行以下操作:

redis-cli --scan --pattern 'Product:*:*' | xargs redis-cli DEL

4
不太确定为什么之前的方法行不通,但是改用下面这个方法就成功了: redis-cli keys '*' | grep Product | xargs -i redis-cli del {} - kakoma
2
没问题,我不得不接受整容手术,以消除我的手掌在脸上的印记 <- 这么多年都这样 :) - Itamar Haber
您还可以使用 -u 参数选择服务器,使用 -n 参数选择数据库,例如 redis-cli -u redis://redisserver:6379 -n 1 --scan --pattern 'Product:*:*' - OzzyCzech
我遇到了(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,否则它无法解析每行的关键结果。 - Sany Liew
显示剩余3条评论

10

从redis 2.6.0开始,你可以使用LUA脚本。

相较于 SCAN | XARGS 变体,你应该使用这个变体,因为它速度更快。

以下脚本也适用于大量的键。

  1. 打开redis-cli
redis-cli -p somePort -a somePassword
  1. 将一些样式替换为您的样式,例如*汽车*(请记住这不是正则表达式)
EVAL "for _,k in ipairs(redis.call('keys','somePattern')) do redis.call('del',k) end" 0

5

没有内置命令可以直接完成这个操作。您需要使用SCAN命令获取与模式匹配的所有键,然后使用DEL命令删除这些键。

// scan from cursor 0 to get the next cursor and keys
SCAN 0 match Product:*:*
// next_cursor, Product:x1:y1, Product:x2:y2, ...
DEL Product:x1:y1 Product:x2:y2 ...
// scan from the next cursor until it return 0
SCAN next_cursor match Product:*:*

另一个解决方案是使用 HASH 存储这种模式的键:
// set key value
HSET Products Product:<id>:<url> value
// remove a single key
HDEL Products Product:<id>:<url>
// remove all keys
DEL Products

你能给我一个扫描并删除的例子吗? - John FG
@JohnFG 我更新了答案。有关“SCAN”的更多详细信息,请查阅文档。 - for_stack

4
-n <db>            Database number

Shell命令: redis-cli -n 1 --scan --pattern prefix:* | xargs redis-cli -n 1 del


该命令用于删除Redis数据库1中以“prefix:”开头的所有键值对。

2

将想要删除的所有键放入keylist.txt文件中,然后执行以下操作:

cat keylist.txt | while read rediskey; do echo "Deleting $rediskey" && redis-cli -c -h 'hostname' -p XXXX -a 'XXXXXX' UNLINK $rediskey; done

0

有几种方法可以做到这一点。

  1. https://gist.github.com/ddre54/0a4751676272e0da8186 不建议在生产服务器上使用,因为它使用了KEYS关键字
  2. 使用ioredis (https://github.com/luin/ioredis#streamify-scanning),支持Redis >= 2.6.12和(Node.js >= 6)

如果您想遵循第二个示例,请执行以下步骤:

安装 node js >=6
创建文件夹并使用以下命令安装 ioredis: npm install ioredis
在该文件夹中创建 redis.js 文件,并添加以下内容:
module.exports.redisDel = function(key) { console.log("del started for key: ", key); var Redis = require("ioredis");
var redis = new Redis({ port: 6379, // Redis 端口 host: "192.168.93.27", // Redis 主机 family: 4, // 4(IPv4)或 6(IPv6) password: "SetCorrectPassword" });
return new Promise((resolve, reject) => {
var stream = redis.scanStream({ // 只返回符合模式“key”的键 match: key, // 每次调用返回大约 100 个元素 count: 100 });
stream.on('data', function (resultKeys) { if (resultKeys.length) { console.log(resultKeys) redis.del(resultKeys); //从版本 4 开始,使用 unlink 替代 del } else { console.log("nothing found"); } }); stream.on('end', function (resultKeys) { console.log("end"); resolve() }) }) }
通过传递所需的键(在本例中为 yourKey*)运行脚本。

node -e 'require(\"./redis\").redisDel(\"yourKey*\")'

可以用于Redis数据库中删除所有以 "yourKey" 开头的键。

0
对于 Windows 的 cmd.exe 命令解释器,请使用带有 /F 参数的 FOR
FOR /F %I IN ('redis-cli KEYS Product:*:*') DO redis-cli DEL %I

如果您启用了反引号命令(不太可能),则可能需要使用反引号而不是撇号。

来源:FOR /?


0
上面Itamar提出的答案完美地解决了问题。
但是,如果您在删除时需要在redis设置中提供身份验证,并且需要选择要运行del命令的主机,您可以按照以下方式添加密码、端口和主机:
redis-cli -a {password} --scan --pattern "*{your pattern}*"  -h {hostip} -p {port}| xargs redis-cli -a {password} -h {hostip} -p {port} del

这解决了我的问题,希望对你也有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接