복붙노트

[REDIS] NODE에서 레디 스 SCAN을 사용하여

REDIS

NODE에서 레디 스 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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    5.이를 통해 이동, 그것은 도움이 될 수 있습니다.

    이를 통해 이동, 그것은 도움이 될 수 있습니다.

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

    이 코드를 사용할에서 통과로 라이브러리를 사용하지 않는 https://github.com/fritzy/node-redisscan/blob/master/index.js

  6. from https://stackoverflow.com/questions/37642762/using-redis-scan-in-node by cc-by-sa and MIT license