我正在使用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);
});
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句