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

如何重用socket.io中的Redis连接?

齐泰
2023-03-14
问题内容

这是我使用socket.io作为WebSocket并使用pub / sub redis后端的代码。

var io = io.listen(server),
    buffer = [];

var redis = require("redis");

var subscribe = redis.createClient();  **<--- open new connection overhead**

io.on('connection', function(client) {

    console.log(client.request.headers.cookie);

    subscribe.get("..", function (err, replies) {

    });

    subscribe.on("message",function(channel,message) {

        var msg = { message: [client.sessionId, message] };
        buffer.push(msg);
        if (buffer.length > 15) buffer.shift();
        client.send(msg);
    });

    client.on('message', function(message){
    });

    client.on('disconnect', function(){
        subscribe.quit();
    });
});

每个新的io请求都将创建新的Redis连接。如果有人打开带有100个选项卡的浏览器,则Redis客户端将打开100个连接。看起来不太好。

如果Cookie相同,是否可以重用Redis连接?因此,如果有人打开许多浏览器选项卡,也将其视为打开1连接。


问题答案:

实际上,如果要在“连接”事件上实例化客户端,则只为每个连接创建一个新的Redis客户端。创建聊天系统时,我更喜欢创建三个Redis客户端。一种用于发布,订阅,另一种用于将值存储到Redis中。

例如:

var socketio = require("socket.io")
var redis = require("redis")

// redis clients
var store = redis.createClient()
var pub = redis.createClient()
var sub = redis.createClient()

// ... application paths go here

var socket = socketio.listen(app)

sub.subscribe("chat")

socket.on("connection", function(client){
  client.send("welcome!")

  client.on("message", function(text){
    store.incr("messageNextId", function(e, id){
      store.hmset("messages:" + id, { uid: client.sessionId, text: text }, function(e, r){
        pub.publish("chat", "messages:" + id)
      })
    })
  })

  client.on("disconnect", function(){
    client.broadcast(client.sessionId + " disconnected")
  })

  sub.on("message", function(pattern, key){
    store.hgetall(key, function(e, obj){
      client.send(obj.uid + ": " + obj.text)
    })
  })

})


 类似资料:
  • 我正在制作一个实时多人游戏socket.io和node.js,我有一个html文件,运行一个公共脚本连接到服务器并运行命令,以及定义我需要的库

  • 问题内容: 大家好,感谢您的宝贵时间和帮助。 我需要一个使用socket.io-redis的简单示例,请提供注释。我阅读了文档,但听不懂。谢谢, 问题答案: socket.io-redis文档没有提到您实际上需要运行redis服务器,因此您可能已经忘记了这一点。socket.io- redis插件使用redis服务器的pub / sub客户端连接多个socket.io实例。 从https://re

  • 我正在尝试映射连接到我的聊天应用程序的用户,并在div中呈现他们。 我将用户保存在一个对象数组中,并在用户在后端连接和断开与聊天室的连接时发送一个事件更新该数组,在前端获取该对象,将其保存在一个数组中,并使用map显示用户。 当我映射数组来显示用户时,我的页面只显示当前用户和后续用户,而不显示之前连接的用户。例如,如果我打开名为“布鲁斯”的应用程序和另一个用户为“安德鲁”的页面,第一个页面将同时显

  • 问题内容: 我试图了解哪些是应用程序的“物理”限制。 在客户端: 在服务器端: 在OSX中达到文件限制(256)时,统计信息如下 让我感到困惑的是: 如果我强行关闭连接(这是我想对客户端执行的操作,为什么我仍在使用文件句柄(因此达到文件限制),请执行以下操作:编辑:添加延迟似乎使服务器可以保持呼吸并且永远不会达到文件限制)? 有没有一种方法可以完全关闭套接字,以便可以确定很少达到文件限制(我知道可

  • 问题内容: 我正在创建一个laravel程序包,在这个页面中我需要在Redis中保存一些数据,但是我希望该程序包使用不同的Redis连接,以便他们可以在程序包的配置文件中设置Redis详细信息凭据并将其用于这个包。我想给包用户使用不同的Redis连接的自由。 如果您有任何想法,我怎么能做到这一点。任何帮助,将不胜感激。 问题答案: 文档中有一节称为 使用多个Redis连接 更改连接呼叫 您可以在运

  • 一般把token放在请求头呢?还是每次发消息都携带呢?如果放在请求头的话,怎么重置呢?当重新连接的话,又会引发一个socketid变化的问题,又该怎么处理好点?