9

我已经在 centos 中安装了 Redis,并且我有多个这样的 redis 键,

Product:<id>:<url>

如何Product:*:* 使用 CLI 删除所有内容?

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

谢谢!

4

6 回答 6

24

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

redis-cli --scan --pattern 'Product:*:*' | xargs redis-cli DEL
于 2016-11-18T16:32:15.013 回答
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:*:*

另一种解决方案是使用 aHASH来保存此模式的键:

// set key value
HSET Products Product:<id>:<url> value
// remove a single key
HDEL Products Product:<id>:<url>
// remove all keys
DEL Products
于 2016-11-18T13:27:20.173 回答
4
-n <db>            Database number

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

于 2019-05-29T10:07:07.413 回答
4

从 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
于 2020-12-23T16:54:39.377 回答
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
于 2021-01-29T11:52:40.880 回答
-1

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

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

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

  1. 安装节点 js >=6
  2. 通过运行以下命令创建文件夹并在其中安装 ioredis:

    npm 安装 ioredis

  3. 在该文件夹中创建具有以下内容的 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()
        })
    })
    

    }

  4. 通过传递所需的密钥来运行脚本(在我们的例子中是 yourKey*)

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

于 2019-09-03T15:24:16.347 回答