Атомарное действие для получения значений из redis key nodejs - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть приложение nodejs и сервер redis.Приложение продвигается с помощью redis client.lpush, и мне действительно нужен способ POP-диапазона объекта от redis и итерация объектов, которые он выдал атомарным способом.На кластере запущено несколько клиентов, и я хочу, чтобы они прочитали обновленный ключ.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете использовать Транзакция Redis .Транзакция Redis - это транзакция, которая будет выполняться последовательно и атомарно.Вы можете прочитать о транзакции здесь

Вы можете сделать это, используя команду MULTI в redis.

Если вы используете redis (известный клиент npm redis), то он предоставляет функцию MULTI .Вы можете прочитать о multi здесь

Вы можете сделать это, используя multi -

var redis  = require("redis"),
    client = redis.createClient(), multi;

// start a separate multi command queue
multi = client.multi();
multi.lpop("keyName", function() {
 // do your thing
 multi.exec(function (err, replies) {
    console.log(replies); // 101, 2
});
});

// drains multi queue and runs atomically

0 голосов
/ 03 февраля 2019

Начиная с Redis 3.2, вы можете проверить

окончательное решение:

При использовании lrange и ltrim в мультиоперации необходимо убедиться, что оба выполняются атомарным образом, и между ними нет прерываний.В приведенном ниже примере есть использование multi для заданного ключа, а count представляет количество объектов для повторения.Он возвращает первый (самый старый) n объект (используя lrange с заданным количеством), а затем удаляет их из redis (используя обрезку в соответствии с заданным числом).

static multiExecutionRedis (key, count){
        return new Promise((resolve, reject) => {
            console.log("running multi execution in the client");
            let client = Reporter.cache;
            let multi = client.multi();
            multi.lrange(key, (count * -1), -1)
                .ltrim(key, 0, (++count) * -1)
                .exec((error, data) => {
                    if (error) {
                        console.log(error);
                        reject(error);
                    } else {
                        console.log("returning valid data");
                        resolve(data[0]);
                    }
                });
        });

Для redis> 4.0 выможете проверить здесь https://github.com/RedisLabsModules/redex#rxlists

...