检查sadd命令的返回(**insertrows**)时,为什么我的multi不起作用?

wwodge7n  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(236)


为什么在检查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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题