【问题标题】:Redis cli delete multiple keysredis cli删除多个key
【发布时间】:2017-04-02 08:38:40
【问题描述】:

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

Product:<id>:<url>

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

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

谢谢!

【问题讨论】:

标签: redis stackexchange.redis phpredis redis-cli


【解决方案1】:

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

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

【讨论】:

  • 不太清楚为什么这对我来说失败了,但切换到这个并且它起作用了:redis-cli keys '*' | grep Product | xargs -i redis-cli del {}
  • @kakoma“失败”了怎么办?
  • 我的坏@Itamar。刚刚意识到我输入了错误的图案掌心一切都很好。谢谢你的提示!赞成
  • 没问题,我不得不接受整容手术来去除我脸上的手掌印
  • 听起来不错,但如果您有多个数据库或数千或数百万个键,我会在下面发布我的搜索结果作为答案
【解决方案2】:

没有用于此的内置命令。您必须使用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

【讨论】:

  • 你能给我举个例子扫描然后删除吗?
  • @JohnFG 我更新了答案。有关SCAN 的更多详细信息,请查看文档。
【解决方案3】:
-n <db>            Database number

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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        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*\")'

        【讨论】:

          猜你喜欢
          • 2020-04-19
          • 1970-01-01
          • 2020-01-26
          • 1970-01-01
          • 2020-10-13
          • 2017-10-08
          • 2011-08-29
          • 1970-01-01
          • 2016-04-12
          相关资源
          最近更新 更多