【问题标题】:Deleting keys from redis using node js使用node js从redis中删除键
【发布时间】:2023-03-06 02:53:01
【问题描述】:

我正在尝试使用下面的代码删除 redis 中的键,但由于某种原因,它不会删除 redis 中的键,但consoling 效果很好。有人可以帮助我在这里缺少什么

import { RedisClient } from 'redis';

let rediClient: RedisClient = redis.createClient(redisPort, redisHostName, {
    auth_pass: authPass,
    no_ready_check: true,
    prefix: KEY_PREFIX,
    retry_strategy: redisRetryStrategy,
    tls: { servername: hostName },
  });

let cursor = '0';

const scan = (pattern: string, callback: () => void) => {
  redisClient.scan(
    cursor,
    'MATCH',
    pattern,
    'COUNT',
    '1000',
    async (err, reply) => {
      console.log(err);
      if (err) {
        throw err;
      }
      cursor = reply[0];
      const keys = reply[1];
      console.log(keys);
      console.log(keys.length);
      console.log(keys[1]);
      if (keys) {
        await redisClient.del(keys[1], (deleteErr, deleteSuccess) => {
          console.log(`err ==> ${deleteErr}`);
          console.log(deleteSuccess);
        });
        console.log(` key 0 is : ${keys[0]}`);
        redisClient.del(keys[0]);
        // keys.forEach((key) => {
        //   redisClient.del(key, (deleteErr, deleteSuccess) => {
        //     console.log(`err ==> ${deleteErr}`);
        //     console.log(deleteSuccess);
        //   });
        // });
      }

      if (cursor !== '0') {
        console.log(cursor);
        return scan(pattern, callback);
      }

      return callback();
    }
  );
};

export const deleteResetPin = (pattern: string) => {
  scan(pattern, () => {
    console.log('Scan Complete');
  });
};

需求:我想用node js删除所有匹配pattern的key

【问题讨论】:

    标签: node.js redis


    【解决方案1】:

    在注释部分(从keys.forEach 开始)运行scan 函数将删除所有匹配模式的键,但这里有几个需要修复/改进的想法:

    1. 将在删除键之前调用回调(因此也调用日志)。
    2. 如果扫描回复错误,则错误将未被捕获,进程将退出。
    3. 您正在混合使用回调和承诺。
    4. 您可以一次删除一堆键。

    这是函数的“承诺”版本:

    const { promisify } = require('util'),
      client = require('redis').createClient(),
      scanAsync = promisify(client.scan).bind(client),
      delAsync = promisify(client.del).bind(client);
    
    async function scanAndDelete(pattern: string): Promise<void> {
      let cursor = '0';
      do {
        const reply = await scanAsync(cursor, 'MATCH', pattern, 'COUNT', '1000');
        cursor = reply[0];
        
        await delAsync(reply[1]);
      } while (cursor !== '0')
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 2018-03-10
      • 2020-02-13
      • 2018-03-06
      • 2013-12-12
      • 2022-01-12
      • 2021-07-01
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多