Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何将属性与Redis Store中的socket.io对象关联?_Node.js_Sockets_Redis_Socket.io_Load Balancing - Fatal编程技术网

Node.js 如何将属性与Redis Store中的socket.io对象关联?

Node.js 如何将属性与Redis Store中的socket.io对象关联?,node.js,sockets,redis,socket.io,load-balancing,Node.js,Sockets,Redis,Socket.io,Load Balancing,我正在使用Nodejs和Socket.io开发一个复杂的游戏,在这个游戏中,我需要将Socket.io对象存储在内存中,并为Socket对象分配属性(例如名称、Socket中某个操作的计数器等) 在下面的代码中,我展示了一个我试图实现的示例。我将所有套接字存储在一个数组中,还有另一个数组存储套接字的name属性。 在任何时候,如果我收到一个名称请求,我可以从内存中的数组中选择名称 但是现在我有太多的用户,我需要在多个服务器之间平衡我的应用程序的负载。所以我不能在内存中存储对象和属性。我需要将它们

我正在使用Nodejs和Socket.io开发一个复杂的游戏,在这个游戏中,我需要将Socket.io对象存储在内存中,并为Socket对象分配属性(例如名称、Socket中某个操作的计数器等)

在下面的代码中,我展示了一个我试图实现的示例。我将所有套接字存储在一个数组中,还有另一个数组存储套接字的name属性。 在任何时候,如果我收到一个名称请求,我可以从内存中的数组中选择名称

但是现在我有太多的用户,我需要在多个服务器之间平衡我的应用程序的负载。所以我不能在内存中存储对象和属性。我需要将它们存储在数据库中

我计划使用Redis。此链接说明如何将Redis Store用于套接字-

但是我如何将我的其他属性(比如名称等)与Redis商店中的套接字对象相关联呢?如果有一些新的方法来实现这一点,请让我也知道

 var socket_array = new Array();
var socket_name_array = new Array();

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {

socket_array.push(socket);
var i = socket_array.indexOf(socket);
var name = generate_random_name();
socket_name_array[i]= name;

  socket.on('get_name', function (data) {

var i = socket_array.indexOf(socket);
var name= socket_name_array[i]
socket.emit('socket_name' , {name :name } );


  });
});

function generate_random_name(){

var random_string;
//code 
return random_string;

}

是的,如果您想要负载平衡socket.io服务器,您必须使用redisstore之类的存储

但是,现在不应该使用“socket\u name\u array”+事件来维护服务器上的数据一致性

安装程序 用法
伟大的我会试试这个。有没有一种好方法可以访问名为“socket123”的socket对象而不必遍历所有socket?socket.io会自动为每个socket分配一个id(socket.id),我不知道有任何公共socket.io方法可以简化对socket的访问,只需使用u.first(io.sockets,{'id':'socket\u id')轻松检索它(var=require('lodash')).PS:可能是io.sockets.sockets而不是io.sockets,我总是记不起来:)
var redis = require('redis'),
var pub = redis.createClient(port, host),
var sub = redis.createClient(port, host),
var client = redis.createClient(port, host);

io.configure(function(){
    io.set('store', new RedisStore({
        redisPub: pub,
        redisSub : sub,
        redisClient : client
    }));
});
io.sockets.on('connection', function (socket) {
  var name = generate_random_name();
  socket.set('name', name); // store it in redis and forward this to other socket.io servers

  // On another server, if you want to retrieve this value from this socket just do:
  socket.get('name', function(err, name){
    // don't forget err. handling
    console.log(name);
  });

});