[REDIS] NODE에서 레디 스 SCAN을 사용하여
REDISNODE에서 레디 스 SCAN을 사용하여
나는 어떤 형식의 키의 많은 레디 스를하고 난 몇 가지 패턴과 일치하는 그들에 대한 몇 가지 작업을 할 키를 싶어. 그것은 생산에 권장하지 이후 나는 KEYS 방법을 사용하지 마십시오. 사용 SCAN 나는 코드를 작성하는 최선의 방법이 무엇인지 궁금하네요. 나는 루프하지만 약속을 사용하여이이처럼 내 현재 솔루션의 외모 (코드가 약간 단순화) 동안 뭔가를 할 필요가 :
'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');
})();
저는 누락 된 것을 그것을 할 수있는 더 좋은 방법이 있나요?
해결법
-
==============================
1.작업이 완료 될 때까지 검사를 계속 전화 재귀를 사용할 수 있습니다.
작업이 완료 될 때까지 검사를 계속 전화 재귀를 사용할 수 있습니다.
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) } }); }
확인 키를 만들 수있는 설정 ()으로 이동이 중복되지
myResults = new Set(); scanAsync('0', "NOC-*[^listen]*", myResults).map( function( myResults ){ console.log( myResults); } );
-
==============================
2.당신은 반복과 'delete` 당 스캔 (1000) 키에이 조각을 시도 할 수 있습니다.
당신은 반복과 'delete` 당 스캔 (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'); });
-
==============================
3.나는 이것이 정말 오래된 질문 실현,하지만 난 매우 불만족 다른 답변을 모두 발견했다. 여기서 비동기 AWAIT (사용 또 외부 의존성없이)를 사용하여 비교적 깨끗한 방법으로 검사 할 또 다른 시도이다. 당신은 쉽게 지속적으로 발견 키의 각 세트를 (당신은 제비가있는 경우에이 같은 일괄를 해결하려는 것)을 삭제하려면이 옵션을 수정할 수 있습니다. 배열로를 누르면 그냥 당신이이 단계에서 그들과 함께 할 수있는 하나의 아주 기본적인 것을 보여줍니다.
나는 이것이 정말 오래된 질문 실현,하지만 난 매우 불만족 다른 답변을 모두 발견했다. 여기서 비동기 AWAIT (사용 또 외부 의존성없이)를 사용하여 비교적 깨끗한 방법으로 검사 할 또 다른 시도이다. 당신은 쉽게 지속적으로 발견 키의 각 세트를 (당신은 제비가있는 경우에이 같은 일괄를 해결하려는 것)을 삭제하려면이 옵션을 수정할 수 있습니다. 배열로를 누르면 그냥 당신이이 단계에서 그들과 함께 할 수있는 하나의 아주 기본적인 것을 보여줍니다.
const redis = require('redis'); const { promisify } = require('util'); const client = redis.createClient({...opts}); const scan = promisify(client.scan).bind(client); const scanAll = async (pattern) => { const found = []; let cursor = '0'; do { const reply = await scan(cursor, 'MATCH', pattern); cursor = reply[0]; found.push(...reply[1]); } while (cursor !== '0'); return found; }
-
==============================
4.나는 레디 스에 대한 노드 바인딩이 여기 호출자에게 너무 많은 책임을 추진하고있다 생각합니다. 그래서,뿐만 아니라 스캔 노드에 발전기를 사용하여 내 자신의 라이브러리를 생성 :
나는 레디 스에 대한 노드 바인딩이 여기 호출자에게 너무 많은 책임을 추진하고있다 생각합니다. 그래서,뿐만 아니라 스캔 노드에 발전기를 사용하여 내 자신의 라이브러리를 생성 :
const redis = require('redis') const client = redis.createClient(…) const generators = require('redis-async-gen') const { keysMatching } = generators.using(client) … for await (const key of keysMatching('test*')) { console.info(key) }
그것은 분명히 당신에 대해 관심을 가져야한다는 것은 것을 마지막 비트입니다. 대신 조심스럽게 반복자를 직접 제어 할 필요없이, 당신이 할 필요가있는 이해를 위해를 사용합니다.
나는 여기에 대해 더 썼다.
-
==============================
5.이를 통해 이동, 그것은 도움이 될 수 있습니다.
이를 통해 이동, 그것은 도움이 될 수 있습니다.
https://github.com/fritzy/node-redisscan
이 코드를 사용할에서 통과로 라이브러리를 사용하지 않는 https://github.com/fritzy/node-redisscan/blob/master/index.js
from https://stackoverflow.com/questions/37642762/using-redis-scan-in-node by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 봄 4 일반적인 RedisTemplate을 건조 (0) | 2020.01.19 |
---|---|
[REDIS] 레디 스 연결 / 버퍼 크기 제한을 초과 (0) | 2020.01.19 |
[REDIS] 레디 스 펍 / 하위에 떨어 연결에서 복구 (0) | 2020.01.19 |
[REDIS] 봄 레디 스 정렬 키 (0) | 2020.01.19 |
[REDIS] 레디 스 평 : 때 연결 풀을 사용하는? (0) | 2020.01.19 |