Node.js 如果第二个命令
使用node_redis客户端,我如何使两个命令执行,以便在第二个命令依赖于第一个命令的结果时,它们将以原子方式执行 这是我思考的一个例子Node.js 如果第二个命令,node.js,node-redis,Node.js,Node Redis,使用node_redis客户端,我如何使两个命令执行,以便在第二个命令依赖于第一个命令的结果时,它们将以原子方式执行 这是我思考的一个例子 client.multi([ ["hget", orgId, topicId] ]).exec(function (err, sessions) { sessions = JSON.parse(sessions); if (sessions === undefined) { sessions = [sessionId]
client.multi([
["hget", orgId, topicId]
]).exec(function (err, sessions) {
sessions = JSON.parse(sessions);
if (sessions === undefined) {
sessions = [sessionId];
}
else {
sessions.push(sessionId)
}
client.hset(orgId, topicId, JSON.stringify(sessions)]);
});
如果在两个位置同时运行,是否有人可以确认不存在写回新值的竞争条件。正确的答案是“观察”该值。确保每个查询都有自己的连接并处理并发错误的可能性也很重要
var atomicReadWriteOperationRecursive = function (hashKey, valueKey, count) {
var client = redis.createClient();
client.watch(hashKey, valueKey);
client.hget(hashKey, valueKey, function (err, response) {
client.multi()
.hset(orgId, topicId, newValue);
.exec(function (err) {
client.close();
if (err && count < 3) {
atomicReadWriteOperationRecursive(hashKey, valueKey, count++);
}
});
});
}
var atomicReadWriteOperationRecursive=函数(hashKey、valueKey、count){
var client=redis.createClient();
client.watch(hashKey、valueKey);
hget(hashKey、valueKey、函数(err、response){
client.multi()
.hset(原始ID、主题ID、新值);
.exec(函数(错误){
client.close();
如果(错误和计数<3){
atomicReadWriteOperationRecursive(hashKey、valueKey、count++);
}
});
});
}
看这里