当前位置: 首页 > 面试题库 >

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

楚乐逸
2023-03-14
问题内容

我正在使用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);
  });

});


 类似资料:
  • 问题内容: 我正在尝试在多个进程和/或服务器上扩展一个简单的socket.io应用程序。 Socket.io支持RedisStore,但是我对如何使用它感到困惑。 我正在看这个例子, http://www.ranu.com.ar/post/50418940422/redisstore-and-rooms-with- socket-io 但是我不明白在该代码中使用RedisStore与使用Memor

  • 假设我们有一个这样定义的对象A: 出于某种原因,我需要创建第二个对象B,它只具有对象A的前两个属性: 所以我的问题是:将对象A复制到对象B的最佳方法是什么?我一直在逐个复制获取者和设置者的属性,但有些事情告诉我一定有更好的方法来做到这一点!特别是当对象将具有很多属性时,我必须编写一行又一行的代码,只是为了将它们全部复制到第二个对象B... 多谢了:) 编辑:我一直被一个“另一个问题的可能重复”提醒

  • 我有一堆运行程序,我想通过线程池来执行。然而,每个运行程序也会将一些结果写入一些文件。所以现在,运行程序的界面很简单: 然而,我想要的是将一个BufferedWriter(换句话说,一个输出文件)与Executor池中的每个线程相关联。但是,我正在调用功能,如下所示: 我不知道执行器将分配哪个线程来运行给定的任务,所以我不知道应该向runnable提供哪个BufferedWriter。如何确保Ex

  • 我试图了解预取相关和选择相关用于优化的用法。我在博客的某个地方了解到,使用预取和选择的一个地方是,预取与选择相关用于反向关系,选择与选择相关用于正向关系。就我而言,有简历模式和教育模式。教育模型在查询时没有写入附加的_集,而是将简历的FK与相关的_名称设置为反向关系。我需要列出所有的教育要求的用户与要求的用户简历。我可以在没有以下优化技术的情况下做到这一点 当我试图使用以下内容时,我得到了我在标题

  • 问题内容: 表达式喜欢并且返回相同的东西。 当我们需要HTMLElement对象的属性时,应该使用哪一个? 这些方法和和有没有跨浏览器的问题? 还是直接访问对象属性与使用这些属性方法之间的性能影响? 问题答案: 检索DOM元素的 属性 ,而检索此DOM元素的 属性 。他们不一样。 大多数情况下,DOM属性与属性同步。 但是,同步 不能保证相同的值 。一个典型的例子是间和对一个锚定元件。 例如: 发

  • 如何处理对象的javascript数组,例如: 并通过求和这些值合并重复的键。为了得到这样的东西: 我尝试过迭代并添加到一个新数组中,但这没有起到作用: