ioredis按模式删除所有键

Hoa*_* Le 5 redis node.js

我正在使用带有express(nodejs)的ioredis我知道有一种方法可以通过这样的模式删除键:

redis-cli KEYS "sample_pattern:*" | xargs redis-cli DEL
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法使用ioredis呢?

lui*_*uin 19

按模式删除键的最直接方法是使用keys命令获取与模式匹配的键,然后逐个删除它们,这类似于您提供的命令行示例.以下是使用ioredis实现的示例:

var Redis = require('ioredis');
var redis = new Redis();
redis.keys('sample_pattern:*').then(function (keys) {
  // Use pipeline instead of sending
  // one command each time to improve the
  // performance.
  var pipeline = redis.pipeline();
  keys.forEach(function (key) {
    pipeline.del(key);
  });
  return pipeline.exec();
});
Run Code Online (Sandbox Code Playgroud)

但是,当您的数据库具有大量密钥(例如一百万个)时,keys将阻塞数据库几秒钟.在那种情况下,scan更有用.ioredis具有scanStream帮助您轻松迭代数据库的功能:

var Redis = require('ioredis');
var redis = new Redis();
// Create a readable stream (object mode)
var stream = redis.scanStream({
  match: 'sample_pattern:*'
});
stream.on('data', function (keys) {
  // `keys` is an array of strings representing key names
  if (keys.length) {
    var pipeline = redis.pipeline();
    keys.forEach(function (key) {
      pipeline.del(key);
    });
    pipeline.exec();
  }
});
stream.on('end', function () {
  console.log('done');
});
Run Code Online (Sandbox Code Playgroud)

不要忘记查看scan命令的官方文档以获取更多信息:http://redis.io/commands/scan.

  • 我认为使用 `unlink` 比使用 `del` 更有效,例如 `redis.unlink(keys)` 并删除 `pipeline` 和 `forEach` 循环。 (2认同)

小智 7

首先按模式选择密钥,然后按del方法删除它们。

const keys = await ioredis.keys('PATTERN:*');

await ioredis.del(keys);
Run Code Online (Sandbox Code Playgroud)


小智 -4

我对 ioredis 不太了解。但我认为键 * 和 for 循环可以处理它。

顺便说一句,我建议你应该使用 scan 和 del 代替 ~