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

标签 node.js sockets redis socket.io load-balancing

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

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

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

我打算使用Redis。此链接讲述如何使用 Redis Store 作为套接字 -

https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO

但是如何将我的其他属性(例如名称等)关联到 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_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);
  });

});

关于node.js - 如何将属性关联到Redis Store中的socket.io对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22649472/

相关文章:

angularjs - 如何从mongodb中传递数组获取结果?

javascript - Nodejs Express 在 POST 上提供静态内容

javascript - 如何定义 Node.js 应用上下文路径?

javascript - Node : Find object from array not contained in another array

c++ - 在 C/C++ 中联网?

Java:多线程和 UDP 套接字编程

asp.net - ASP .Net Core 在 JWTBearerOptions.Events OnTokenValidated 事件中访问 DistributedRedisCache

c++ - 客户端未收到 UDP 连接响应

php - 使用 Redis 的 Laravel 缓存 - 这个键是什么意思?

redis - 为什么我的 redis 命令键不会阻止我的其他操作