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