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

我正在用Nodejs和Socket.io来处理一个复杂的游戏,我需要将socket.io对象存储在内存中,还要为套接字对象指定属性(比如名称,来自套接字的某个动作的计数器等)

在下面的代码中,我已经展示了我想要实现的一个例子。 我将所有套接字存储在一个数组中,并且还有另一个存储套接字名称属性的数组。 在任何时候,如果我得到名称的请求,我可以从内存中的数组中select名称。

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

我打算使用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”+事件来保持你的服务器之间的数据一致。

build立

 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); }); });