【发布时间】:2017-04-02 08:38:40
【问题描述】:
我在centos中安装了Redis,我有多个这样的redis键,
Product:<id>:<url>
如何使用 CLI 删除所有 Product:*:*?
Redis 版本:3.2.4 [我猜是最新的]
谢谢!
【问题讨论】:
标签: redis stackexchange.redis phpredis redis-cli
我在centos中安装了Redis,我有多个这样的redis键,
Product:<id>:<url>
如何使用 CLI 删除所有 Product:*:*?
Redis 版本:3.2.4 [我猜是最新的]
谢谢!
【问题讨论】:
标签: redis stackexchange.redis phpredis redis-cli
使用redis-cli 工具,您可以执行以下操作:
redis-cli --scan --pattern 'Product:*:*' | xargs redis-cli DEL
【讨论】:
redis-cli keys '*' | grep Product | xargs -i redis-cli del {}
没有用于此的内置命令。您必须使用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
【讨论】:
SCAN 的更多详细信息,请查看文档。
-n <db> Database number
外壳:redis-cli -n 1 --scan --pattern prefix:* | xargs redis-cli -n 1 del
【讨论】:
从 redis 2.6.0 开始,可以使用 LUA 脚本。
您应该在SCAN | 上使用此变体。 XARGS 变体,因为它更快。
以下脚本也适用于大量键。
redis-cli -p somePort -a somePassword
*cars*(记住它不是正则表达式)EVAL "for _,k in ipairs(redis.call('keys','somePattern')) do redis.call('del',k) end" 0
【讨论】:
然后将要删除的所有键放入 keylist.txt 文件中:
cat keylist.txt | while read rediskey; do echo "Deleting $rediskey" && redis-cli -c -h 'hostname' -p XXXX -a 'XXXXXX' UNLINK $rediskey; done
【讨论】:
有几种方法可以做到这一点。
如果您想遵循第二个示例,只需执行以下步骤:
创建文件夹并在其中通过运行以下命令安装ioredis:
npm 安装 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 port
host: "192.168.93.27", // Redis host
family: 4, // 4 (IPv4) or 6 (IPv6)
password: "SetCorrectPassword"
});
return new Promise((resolve, reject) => {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
stream.on('data', function (resultKeys) {
if (resultKeys.length) {
console.log(resultKeys)
redis.del(resultKeys); //from version 4 use unlink instead of del
}
else {
console.log("nothing found");
}
});
stream.on('end', function (resultKeys) {
console.log("end");
resolve()
})
})
}
通过传递所需的密钥(在我们的例子中为 yourKey*)运行脚本
node -e 'require(\"./redis\").redisDel(\"yourKey*\")'
【讨论】: