原子操作弹出值的数量从Redis的关键节点JS

问题描述 投票:1回答:2

我有一个应用程序的NodeJS和Redis的服务器。该应用程序使用Redis的client.lpush推,什么我真正需要的是从Redis的POP对象的范围,并迭代它以原子的方式弹出的对象的方式。有对集群中的多个客户端运行,我希望他们能够读取更新的密钥。

node.js redis lua atomicity
2个回答
1
投票

由于Redis的3.2就可以办理入住手续时

最终的解决方案:

通过在多操作使用lrange和LTRIM应该确保两者都以原子方式执行,中间没有中断。在下面的示例中,存在用于使用在给定的键多的使用,并且计数表示对象的数量来迭代上。它返回第一(最旧的)N对象(通过使用lrange与给定的计数)(根据给定的计数使用TRIM),然后除去它们从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
投票

您可以使用Redis的交易。 Redis的交易都将在连续的和原子的方式发生交易。你可以阅读有关事务here

您可以通过在Redis的使用多命令做到这一点。

如果您正在使用Redis的(著名NPM Redis的客户),那么它暴露了多功能。你可以阅读有关多here

您可以通过使用多做到这一点 -

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

© www.soinside.com 2019 - 2024. All rights reserved.