Redis客户端不会删除任何内容

3gtaxfhh  于 2023-04-05  发布在  Redis
关注(0)|答案(3)|浏览(140)

我正在使用node.js redis client。在运行单元测试之前,我想清除所有redis键。由于一些奇怪的原因,我的代码什么也没做。

const redis = require('redis');

const client = redis.createClient({
  host: conf.host,
  port: conf.port,
  prefix: conf.prefix
});

client.on('connect', err => {
  // everything is OK here. I can set and get.
});

module.exports = redis;

在开始测试之前,我想清除缓存:

const redis = require('file-above');

before(done => {
  redis.keys('*', function (err, rows) {
    rows.forEach(row => {
      console.log(row); // perfectly matched
      redis.del(row);
      // nothing changed. I can still get any of the rows above here
    });
  });
  done();
});

在此之后没有删除任何内容。我试图添加setTimeout,试图使用直接redis.del('*', done)没有键匹配。
我在redis包自述文件中找不到任何与.del相关的内容,无法弄清楚我做错了什么。

zazmityj

zazmityj1#

如果合适的话,你应该使用flushall。更多的文档请看这里http://redis.io/commands/FLUSHALL。但是,关于你的实现,我认为你需要传递一个回调到del

cbeh67ev

cbeh67ev2#

问题是你正在使用一个前缀。所以如果你使用keys函数(从文档中它不会附加任何前缀)。但是如果你使用从keys函数中得到的keys并使用它来删除它会再次附加前缀。所以你需要创建一个新的没有前缀选项的redis客户端并使用它,或者你可以在调用del函数之前删除keys数组中的前缀。
例如,您的前缀是**'TEMP:'如果您使用keys函数'*'它会得到keys ['TEMP:name','TEMP:age']
但是在del函数中,如果你迭代数组,会发生的是,要删除的键的名称变成
'TEMP:TEMP:name'**,因为redis将aprefix添加到del函数中,所以键不会被删除。
在循环中迭代时,可以删除键数组中的前缀

const redis = require('file-above');

before(done => {
redis.keys('*', function (err, rows) {
rows.forEach(row => {
  console.log(row); //"TEMP:name"
  row.substr(yourRedisPrefix.length) //this will remove your key prefix from the row so the key name will be without prefix.  "name"
  redis.del(row); // here redis adds the prefix itself. "TEMP:name"
   });
  });
  done();
 });
sgtfey8w

sgtfey8w3#

redis NPM包中没有flushdbflushall命令的实际实现。
如果你想清除node.js中的所有redis键,你必须使用sendCommand,像这样:

await redisClient.sendCommand(["FLUSHALL"]);

Redis NPM Package不支持的Redis命令一节中有更多相关信息。

相关问题