在NODE中使用Redis SCAN [英] Using Redis SCAN in NODE
本文介绍了在NODE中使用Redis SCAN的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
'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屋!
查看全文