Redis не удаляет ключ сразу - PullRequest
0 голосов
/ 26 сентября 2019

РЕДАКТИРОВАТЬ : Оказывается, это был узел, который вызвал это.Цикл for каким-то образом запускает следующую итерацию, прежде чем дождется выполнения обещания.Redis здесь ничего не делает.

У меня есть программа, которая перебирает массив вещей, которые я хочу сравнить с ключом в Redis.Если условие выполнено, я хочу удалить ключ из базы данных.Я использую Ioredis для этого.Код был следующим:

async function checkthings () {
        for (const thing of list_of_things) {
            await new Promise(function (resolve, reject){
                let stream = redis.scanStream({ match: '5:*'})

                stream.on("data", async function (result){
                    result.length > 0 ? console.log(result) : null;
                    stream.pause();

                    for (const key of result) {
                        let result = await redis.hgetall(key);

                        if ([CONDITIONS PUT HERE])
                             await redis.del(key);

                    }

                    stream.resume();
                })

                stream.on("end", function (){
                    console.log("Done iterating.");
                    resolve();
                })
            });
        }
    }   
}

Проблема в том, что когда я запускаю этот код, на первой итерации все работает нормально.Но на второй итерации ключ, который должен был быть удален, был указан в результате сканирования.Даже при использовании KEYS результаты все равно появляются.Я не знаю, была ли это ошибка в моем Node.JS или в Redis.

Извините, если вопрос трудно прочитать.Это мой первый вопрос.

1 Ответ

0 голосов
/ 26 сентября 2019

Из документации SCAN

Заданный элемент может быть возвращен несколько раз.Приложение должно обработать случай дублированных элементов, например, используя только возвращенные элементы для выполнения операций, которые безопасны при многократном повторном применении.

Так что этого следует ожидатьот Редиса SCAN

...