在NODE中使用Redis SCAN [英] Using Redis SCAN in NODE

查看:612
本文介绍了在NODE中使用Redis SCAN的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些格式的Redis有很多的键,我想要获得匹配一些模式的键,并对它们进行一些操作。我不使用KEYS方法,因为它不推荐在生产。使用扫描我想知道在代码中写什么是最好的方法。我必须做一些像while循环,但使用承诺,我目前的解决方案看起来像这样(代码简化了一点):

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

让迭代器= 0;
Promise.coroutine(function *(){
do {
iterator = yield clinet.scanAsync(iterator,'myQuery','COUNT',config.scanChunkSize)
。 (data => {
let nextIterator = data [0];
let values = data [1];
//使用值
返回nextIterator;
})
} while(iterator!=='0');
})();

有没有更好的方法,我失踪了?

解决方案

您可以使用递归来继续调用扫描,直到完成。

  function scanAsync(cursor,pattern,returnSet){

return redisClient.scanAsync(cursor, (
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);}
);


I have Redis with a lot of keys in some format and I want to get keys that match some pattern and do some operations on them. I don't use KEYS method since it's not recommend in production. Using SCAN I'm wondering what is the best way to write it in code. I have to do something like a while loop but using promises, my current solution looks like this (code is simplified a little):

'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');
})();

Is there a better way to do it that I'm missing?

解决方案

You can use recursion to keep calling scan until done.

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)
            }

    });
}

Pass in a Set() to make sure keys aren't duplicated

myResults = new Set();

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

这篇关于在NODE中使用Redis SCAN的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆