redis 删除多个密钥

yxyvkwin  于 2023-02-03  发布在  Redis
关注(0)|答案(7)|浏览(159)

我已经在centos中安装了Redis,我有多个这样的Redis密钥,

Product:<id>:<url>

如何使用CLI删除所有Product:*:*
Redis版本:3.2.4 [我猜是最新版本]
谢谢!

ohtdti5x

ohtdti5x1#

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

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

nwsw7zdq2#

从redis 2.6.0开始,您可以使用LUA脚本。
应该在SCAN上使用此变体|XARGS变体,因为它的速度要快得多。
下面的脚本也适用于大量的键。
1.打开你的redis-cli

redis-cli -p somePort -a somePassword

1.将somePattern替换为您的模式,例如*cars*(记住它不是正则表达式)

EVAL "for _,k in ipairs(redis.call('keys','somePattern')) do redis.call('del',k) end" 0
wwtsj6pe

wwtsj6pe3#

没有内置的命令来实现这个目的,你必须使用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
j2qf4p5b

j2qf4p5b4#

-n <db>            Database number

shell :redis-cli -n 1 --scan --pattern prefix:* | xargs redis-cli -n 1 del

iszxjhcz

iszxjhcz5#

将所有要删除的密钥放入keylist.txt文件中,然后:

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

nfg76nw06#

对于Windows cmd.exe命令解释器,请使用FOR和/F:

FOR /F %I IN ('redis-cli KEYS Product:*:*') DO redis-cli DEL %I

如果启用了反引号命令(不太可能),则可能需要使用反引号而不是撇号。
来源:FOR /?

7uzetpgm

7uzetpgm7#

有几种方法可以做到这一点。
1.不建议在生产服务器上使用https://gist.github.com/ddre54/0a4751676272e0da8186,因为它使用KEYS关键字
1.使用ioredis(https://github.com/luin/ioredis#streamify-scanning),它支持Redis〉= 2.6.12和(Node.js〉= 6)
如果你想按照第二个例子只是做以下步骤:
1.安装节点js〉= 6
1.创建文件夹,并通过运行以下命令在其中安装ioredis:
npm安装ioredis
1.在该文件夹中创建包含以下内容的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()
    })
})

}
1.通过传递所需的键(在我们的示例中为yourKey *)来运行脚本
节点-e '需要(./redis). redisDel(您的密钥 *)'

相关问题