【问题标题】:Can't receive redis data from socket io无法从套接字 io 接收 redis 数据
【发布时间】:2017-02-05 14:06:40
【问题描述】:

我正在使用 redis 作为 python 和 node 之间的 pubsub messenger 构建一个实时可视化。总是运行一个 python 脚本,它使用 hmset 设置 redis 哈希。应用程序的那一侧工作正常,如果我在 redis 客户端中输入以下示例命令:“HGETALL 'sellers-80183917'”,我最终会获得正确的数据。

问题出在js方面。我正在使用 socketio 和 redis nodejs 库来监听 redis 实例并通过 d3js viz 在线发布结果。

我使用节点运行以下代码:

var express = require('express');
var app = express();
var redis = require('redis');

app.use(express.static(__dirname + '/public'));


var http = require('http').Server(app);


var io = require('socket.io')(http);
var sredis = require('socket.io-redis');
io.adapter(sredis({ host: 'localhost', port: 6379 }));



redisSubscriber = redis.createClient(6379, 'localhost', {});


redisSubscriber.on('message', function(channel, message) {
  io.emit(channel, message);
});



app.get('/sellers/:seller_id', function(req, res){
  var seller_id = req.params.seller_id;
  redisSubscriber.subscribe('sellers-'.concat(seller_id)); 


  res.render( 'seller.ejs', { seller:seller_id } );
});


http.listen(3000, '127.0.0.1', function(){
  console.log('listening on *:3000');
});

这是 Seller.ejs 文件的相关部分,用于接收用户请求并输出 viz:

        var socket = io('http://localhost:3000');
        var stats;
        var seller_key = 'sellers-'.concat(<%= seller %>);
        socket.on(seller_key, function(msg){
            stats = [];
            console.log('Im in');
            var seller = $.parseJSON(msg);
            var items = seller['items'];
            for(item in items) {
                var item_data = items[item];
                stats.push({'title': item_data['title'], 'today_visits': item_data['today_visits'], 'sold_today': item_data['sold_today'], 'conversion_rate': item_data['conversion_rate']});
            }
            setupData(stats);
        });

问题是 socket_on() 方法从来没有收到任何东西,我看不出问题出在哪里,因为除此之外一切似乎都工作正常。

【问题讨论】:

    标签: node.js redis socket.io


    【解决方案1】:

    我认为您可能对 Redis 中的 Pub/Sub 究竟是什么感到困惑。 不是一种监听散列变化的方法;您可以有一个名为 sellers-1 的 Pub/Sub 频道,也可以有一个带有键 sellers-1hash,但它们彼此无关。 p>

    据记录 here:

    Pub/Sub 与密钥空间无关。

    有一个叫keyspace notifications的东西可以用来监听key space的变化(通过Pub/Sub通道);但是,默认情况下不启用此功能,因为它会占用更多资源。

    也许更简单的方法是在HMSET 之后发布消息,这样任何订阅者都会知道哈希已更改(然后他们将自己检索哈希内容,或者发布的消息将包含相关数据)。

    这给我们带来了下一个可能的问题:您只有一个订阅者连接,redisSubscriber

    根据我对 Node.js Redis 驱动程序的了解,在此类连接上调用 .subscribe() 将删除任何以前的订阅以支持新订阅。因此,如果您之前订阅了sellers-1 频道并订阅了sellers-2,您将不会再收到来自sellers-1 频道的消息。

    您可以通过传递通道数组或将它们作为参数传递来监听多个通道:

    redisSubscriber.subscribe([ 'sellers-1', 'sellers-2', ... ])
    // Or:
    redisSubscriber.subscribe('sellers-1', 'sellers-2', ... )
    

    您显然必须跟踪每个“活跃”的卖家订阅。要么这样,要么为每个订阅创建一个新连接,这也不理想。

    最好有一个 Pub/Sub 渠道来发布所有更改,而不是为每个卖家设置一个单独的渠道。

    最后:如果您的卖家 ID 不难猜出(例如,如果它基于一个递增的整数值),那么编写一个可以监听任何卖家的客户端将是微不足道的他们想要的频道。这可能不是问题,但需要注意的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 2015-11-26
      • 1970-01-01
      • 2020-03-13
      • 2022-01-18
      相关资源
      最近更新 更多