从Redis关键字中弹出值的原子操作

我有一个Node.js应用程序和Redis服务器。该应用程序使用Redis客户端推送。lpush,我实际需要的是一种从Redis弹出对象范围并以原子方式迭代弹出的对象的方法。有多个客户端针对群集运行,我希望它们读取更新的关键字。

点赞
用户6720343
用户6720343

从 redis 3.2 开始,您可以进行以下检查:

最终解决方案:

通过在多操作中使用 lrange 和 ltrim,可以确保两者以原子方式执行,并且没有中断。 在下面的示例中,使用 multi 来遍历给定键,并且 count 表示要迭代的对象数量。它返回第一个(最旧的)n个对象(通过给定计数使用 lrange),然后将它们从 redis 中移除(使用给定计数根据 ltrim 进行修剪)。

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

2019-02-03 20:29:20
用户5384142
用户5384142

你可以使用Redis 事务。Redis 事务是按顺序和原子方式发生的事务。 关于事务,您可以在这里阅读更多信息。

您可以通过在Redis中使用MULTI命令来实现。

如果您正在使用著名的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
2019-02-03 22:21:42