我正在使用Node.js和Socket.io进行复杂的游戏,需要将socket.io对象存储在内存中,还需要为套接字对象分配属性(例如,名称,来自套接字的某些操作的计数器等)
在下面的代码中,我展示了一个我要实现的示例。我将所有套接字存储在一个数组中,并且还有另一个数组用于存储套接字的name属性。在任何时候,如果我收到名称的请求,都可以从内存中的数组中选择名称。
但是现在我的用户太多了,我需要在多台服务器之间平衡应用程序的负载。所以我不能在内存中存储对象和属性。我需要将它们存储在数据库中。
我打算使用Redis。该链接介绍了如何将Redis Store用于套接字-
https://github.com/LearnBoost/Socket.IO/wiki/Configuring- Socket.IO
但是,如何将其他属性(例如名称等)与Redis Store中的套接字对象相关联?如果有一些新方法可以做到这一点,请也告诉我。
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_name_array” +事件来维护服务器之间的数据一致。
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); }); });