原子操作从Redis键Node.js弹出大量值

时间:2019-02-03 20:13:50

标签: node.js redis lua atomicity

我有一个nodejs应用程序和Redis服务器。 该应用程序正在使用redis client.lpush进行推送,而我真正需要的是一种从redis到POP对象范围并以原子方式迭代它弹出的对象的方法。 有多个客户端在群集上运行,我希望他们读取更新的密钥。

2 个答案:

答案 0 :(得分:1)

从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

答案 1 :(得分:1)

您可以使用 Redis交易。 Redis事务是以顺序和原子方式发生的事务。您可以阅读有关交易here

的信息

您可以通过在Redis中使用 MULTI 命令来执行此操作。

如果您使用的是 redis (著名的npm redis客户端),它将提供 MULTI 功能。您可以阅读有关多个here

的信息

您可以使用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