为什么在检查sadd命令(insertrows)的返回时multi不起作用??
InserirNovoCliente : function(cliente,zona){
return new Promise(function(fullfill,reject){
var sadd = util.promisify(cliente_redis.sadd).bind(cliente_redis);
cliente_redis.sismember("clientes_visualizadores",cliente.ip,function(err,response){
console.log('response',response);
if(response == 0){
sadd("clientes_visualizadores",cliente.ip).then((insertRows)=>{
console.log('insertRows',insertRows);
if(insertRows == 1){
let multi = cliente_redis.multi();
multi.hmset("cliente:"+cliente.ip,cliente);
multi.hincrby("stats:clientes","conectados",1);
multi.hincrby("stats:zonas:"+zona.id_zona+":clientes","conectados",1);
multi.sadd("stats:zonas:"+zona.id_zona+":clientes:ip",cliente.ip);
multi.sadd("cliente:"+cliente.ip+":zonas",zona.id_zona);
multi.exec((err, replies)=>{
// Multi return replies equal null
if(err) throw err;
if(replies === null) reject();
else{
cliente_redis.smembers("clientes_visualizadores",function(err,resp){ console.log('clientes_visualizadores:new:'+ resp.length); });
cliente_redis.hmget("stats:clientes",'conectados',function(err,resp){ console.log('stats:clientes:new:'+ resp); });
console.log(replies);
fullfill();
}
});
}
});
}
});
});
},
或者我也试过的代码
InserirNovoCliente : function(cliente,zona){
return new Promise(function(fullfill,reject){
cliente_redis.sismember("clientes_visualizadores",cliente.ip,function(err,response){
console.log('response',response);
if(response == 0){
var multi = cliente_redis.multi();
multi.sadd("clientes_visualizadores",cliente.ip,function(err,insertRows){
console.log('insertRows',insertRows);
if(insertRows == 1){
multi.hmset("cliente:"+cliente.ip,cliente);
multi.hincrby("stats:clientes","conectados",1);
multi.hincrby("stats:zonas:"+zona.id_zona+":clientes","conectados",1);
multi.sadd("stats:zonas:"+zona.id_zona+":clientes:ip",cliente.ip);
multi.sadd("cliente:"+cliente.ip+":zonas",zona.id_zona);
multi.exec((err, replies)=>{
if(err) throw err;
if(replies === null) reject();
else{
cliente_redis.smembers("clientes_visualizadores",function(err,resp){ console.log('clientes_visualizadores:new:'+ resp.length); });
cliente_redis.hmget("stats:clientes",'conectados',function(err,resp){ console.log('stats:clientes:new:'+ resp); });
console.log(replies);
fullfill();
}
});
}
});
}
});
});
},
这两个代码从不执行multi并返回null。但是如果我做下面的代码片段,它就可以工作了。问题是,如果用户重复连接到套接字,则会发生争用情况,并在该情况下计数两次stats:clientes;
InserirNovoCliente : function(cliente,zona){
return new Promise(function(fullfill,reject){
cliente_redis.sismember("clientes_visualizadores",cliente.ip,function(err,response){
console.log('response',response);
if(response == 0){
let multi = cliente_redis.multi();
multi.sadd("clientes_visualizadores",cliente.ip);
multi.hmset("cliente:"+cliente.ip,cliente);
multi.hincrby("stats:clientes","conectados",1);
multi.hincrby("stats:zonas:"+zona.id_zona+":clientes","conectados",1);
multi.sadd("stats:zonas:"+zona.id_zona+":clientes:ip",cliente.ip);
multi.sadd("cliente:"+cliente.ip+":zonas",zona.id_zona);
multi.exec((err, replies)=>{
if(replies === null) reject();
else{
cliente_redis.smembers("clientes_visualizadores",function(err,resp){ console.log('clientes_visualizadores:new:'+ resp.length); });
cliente_redis.hmget("stats:clientes",'conectados',function(err,resp){ console.log('stats:clientes:new:'+ resp); });
console.log(replies);
fullfill();
}
});
}
});
});
},
正确的日志输出
日志输出导致集合redis中的计数错误stats:clientes
暂无答案!
目前还没有任何答案,快来回答吧!