Redis SCAN не дает всех матчей в NodeJS - PullRequest
0 голосов
/ 18 октября 2018

Я использую скрипт Node.JS с пакетом redis npm, чтобы получить все ключи Redis, соответствующие шаблону animals:toFeed:*.Примером совпадения будет ключ animals:toFeed:17ed160f59c5b31caf7e741a4e62cb7785414cd.

. Используя приведенный ниже код, может быть 10 совпадений, но код вернет только несколько, например 2-3.В чем может быть проблема, и как мы можем ее исправить?

Использование Redis 4.0.11, Node.js 8.11.3, пакет redis 2.8.0 npm

async function scanAsync(cursor, pattern, results) {
    return redis.scanAsync(cursor, 'MATCH', pattern, 'COUNT', '10')
        .then(function(reply) {
            cursor = reply[0]
            if(cursor === '0') {
                console.log('Scan complete')
            } else {
                console.log('Match #', i)
                let keys = reply[1]
                keys.forEach(function(key, i) {
                    results.push(key)
                })
                return scanAsync(cursor, pattern, results)
            }
        })
}

let keys = []
let prefix = 'animals:toFeed:*'
await scanAsync('0', prefix, keys) 

Обновление

  1. Перезагрузка Redis.Все еще есть неполные результаты сканирования
  2. Удалил все ключи, которые соответствуют шаблону, и добавил некоторые ключи обратно.Теперь все возвращается при выполнении сканирования.После часа игры он начинает возвращать неполные результаты еще раз.Повторение этого больше не работает, чтобы решить проблему.

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

… или вы используете redis-async-gen , что не позволяет вам тщательно контролировать все это самостоятельно.(Подробнее об этом здесь .)

const redis = require('redis')
const client = redis.createClient(…)
const generators = require('redis-async-gen')
const { keysMatching } = generators.using(client)

const results = []
for await (const key of keysMatching('test*')) {
  results.push(key)
}
0 голосов
/ 18 октября 2018

Вы забыли добавить ключи в results, когда курсор равен '0', но вы всегда должны добавлять их.

Вы можете рассмотреть свой код следующим образом:

async function scanAsync(cursor, pattern, results) {
    return redis.scanAsync(cursor, 'MATCH', pattern, 'COUNT', '10')
        .then(function(reply) {

            let keys = reply[1]
            keys.forEach(function(key) {
                results.push(key)
            })

            cursor = reply[0]
            if(cursor === '0') {
                console.log('Scan complete')
            } else {
                return scanAsync(cursor, pattern, results)
            }
        })
}
...