在NODE中使用Redis SCAN

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在NODE中使用Redis SCAN相关的知识,希望对你有一定的参考价值。

我有一些格式的Redis有很多键,我想获得匹配某些模式的键并对它们进行一些操作。我不使用KEYS方法,因为它不建议在生产中使用。使用SCAN我想知道在代码中编写它的最佳方法是什么。我必须做一些像while循环但使用promises的东西,我现在的解决方案看起来像这样(代码简化了一点):

'use strict'
const Promise = require('bluebird');
const config = require('./config');
const client = require('./clinet');

let iterator = 0;
Promise.coroutine(function* () {
  do {
    iterator = yield clinet.scanAsync(iterator, 'myQuery', 'COUNT', config.scanChunkSize)
      .then(data => {
        let nextIterator = data[0];
        let values = data[1];
        //do some magic with values
        return nextIterator;
      })
  } while (iterator !== '0');
})();

有没有更好的方法来做到我错过了?

答案

您可以使用递归来保持调用扫描直到完成。

function scanAsync(cursor, pattern, returnSet){

    return redisClient.scanAsync(cursor, "MATCH", pattern, "COUNT", "100").then(
        function (reply) {

            cursor = reply[0];
            var keys = reply[1];
            keys.forEach(function(key,i){
                returnSet.add(key);
            });

            if( cursor === '0' ){
                return Array.from(returnSet);
            }else{
                return scanAsync(cursor, pattern, returnSet)
            }

    });
}

传入Set()以确保密钥不重复

myResults = new Set();

scanAsync('0', "NOC-*[^listen]*", myResults).map( 
    function( myResults ){ console.log( myResults); }
);
另一答案

您可以在每次迭代和“删除”时尝试使用此代码段到scan(1000)密钥。

var cursor = '0';
function scan(pattern,callback){

  redisClient.scan(cursor, 'MATCH',pattern,'COUNT', '1000', function(err, reply){
    if(err){
        throw err;
    }
    cursor = reply[0];
    if(cursor === '0'){
        return callback();
    }else{

        var keys = reply[1];
        keys.forEach(function(key,i){                   
            redisClient.del(key, function(deleteErr, deleteSuccess){
                console.log(key);
            });
        });


        return scan(pattern,callback);
    }
  });
}

scan(strkey,function(){
    console.log('Scan Complete');
});
另一答案

通过这个,它可能会有所帮助。

https://github.com/fritzy/node-redisscan

不要使用库,请查看https://github.com/fritzy/node-redisscan/blob/master/index.js提供的代码

以上是关于在NODE中使用Redis SCAN的主要内容,如果未能解决你的问题,请参考以下文章

Python Redis中Scan遇到问题

Redis 之用 scan 模糊匹配 key

Redis-Jedis使用Scan实现redis前缀key查找

用redis的scan命令代替keys命令,以及在spring-data-redis中遇到的问题

PHP7+REDIS3.2 phpredis scan命令 游标问题

Redis中的Scan命令的使用