相关疑难解决方法(0)

如何在socket.io中重用redis连接?

这是我的代码使用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();
    });
});
Run Code Online (Sandbox Code Playgroud)

每个新的io请求都将创建新的redis连接.如果有人用100个标签打开浏览器,那么redis客户端将打开100个连接.它看起来不太好看.

如果cookie相同,是否可以重用redis连接?因此,如果有人打开许多浏览器标签,也将其视为开放1连接.

redis node.js socket.io

40
推荐指数
1
解决办法
3万
查看次数

Redis Pub-Sub或Socket.IO的广播

我看到了这个片段:

在服务器上

io.sockets.on('connection', function(socket) {
  const subscribe = redis.createClient();
  const publish = redis.createClient();

  socket.on('publish', function(channel, data) {
    publish.publish(channel, data);
  });

  socket.on('psubscribe', function(channel) {
    subscribe.psubscribe(channel);
  });

  subscribe.on("pmessage", function(pattern, channel, message) {
    socket.emit('message', { channel: channel, data: message });
  });
});
Run Code Online (Sandbox Code Playgroud)

在客户端

$(".action").click(function() {
  socket.emit('publish', 'game.#{gameid}.action.' + $(this).data('action'),
  JSON.stringify({ nick: "#{nick}", ts: Date.now() })
);
Run Code Online (Sandbox Code Playgroud)

而我想知道为什么?Socket.IO有没有自己的广播机制?为什么选择Redis'Pub-Sub over Socket.IO?我们不能这样做:

io.sockets.on('connection', function(socket) {
  socket.on('action', function(channel, data) {
    socket.broadcast.to(channel).emit(data)
  });
});
Run Code Online (Sandbox Code Playgroud)

如果有理由使用Redis,那么有什么好处呢?持久性?

real-time publish-subscribe redis socket.io

16
推荐指数
2
解决办法
6905
查看次数

需要了解有关 socket.io 和 redis 和 nginx 的一些信息

我的目标是构建一个聊天应用程序 - 类似于 whatsapp

据我了解,socket.io 是一个用 javascript 编写的实时通信库,使用起来非常简单

例如

 // Serverside
    io.on('connection', function(socket) {
        socket.on('chat', function(msg) {
            io.emit('chat', msg);
      });
    });

 // ClientSide (Using jquery)

   var socket = io();
  $('form').submit(function(){
    socket.emit('chat', $('#m').val());
    $('#m').val('');
    return false;
  });

  socket.on('chat', function(msg){
    $('#messages').append($('<li>').text(msg));
  });
Run Code Online (Sandbox Code Playgroud)

1)我是否总是需要启动一个io.on('connection')来使用实时功能,或者我可以开始使用socket.on对象来代替?例如我有一条路线

app.post('/postSomething', function(req, res) {
    // Do i need to start an io.on or socket.on here?

});
Run Code Online (Sandbox Code Playgroud)

因为我希望实时功能仅在特定路线上收听。

2)Redis是一个处理pub/sub的数据结构库,为什么需要使用pub/sub机制?我阅读了很多文章,但无法掌握其中的概念。文章示例http://ejosh.co/de/2015/01/node-js-socket-io-and-redis-intermediate-tutorial-server-side/

例如下面的代码

// Do i need redis for this, if so why? is it for caching purposes? …
Run Code Online (Sandbox Code Playgroud)

nginx node.js socket.io node-redis socket.io-1.0

1
推荐指数
1
解决办法
912
查看次数