【问题标题】:Followers status update notification using redis pubsub and socket.io使用 redis pubsub 和 socket.io 的关注者状态更新通知
【发布时间】:2016-04-28 08:28:12
【问题描述】:

我正在使用 node.js 创建一个应用程序,表达。今天我尝试实现redis pubsub,用于向关注者发送通知。

当用户登录时,我检索他的恶魔_id 列表并订阅那些_id 作为频道名称。当任何用户更新他的状态时,他们会向他的频道发布通知。在我看来,它应该可以正常工作。

但是对于每个用户,redis 客户端都是相同的。因此,如果一个用户订阅了他的朋友 _id,那么所有用户都会收到有关该频道消息的通知。

我做了什么

在我的 app.js 文件上 -

...
// Because I wanted to publish from express route , so global
var redis = require('redis');
global.pub = redis.createClient();
global.sub = redis.createClient();
...

...
io.on('connection', function(socket){
  console.log(io.engine.clientsCount + " client connected.");
  global.socket = socket;
  
  sub.on("message", function(channel, message){
    console.log("Message "+ message + " on channel " + channel+ " arived");
    socket.emit('notification', {data: message});
  });
  
  socket.on('disconnect', function(){
    console.log(io.engine.clientsCount + " client after disconnecct.");
  });
  
});

...

在我的路由/user.js 文件中

...
router.post('/login', function(req, res, next){
...
...
    Friendship.find({user2: req.session.userid}, function(err, doc){
        if (err) return console.dir(err);


        // req.session.followers = _.pluck(doc, 'user1');
        // console.log(req.session);

        /**
         * 
         */
        var userlist = _.pluck(doc, 'user1');
        console.dir(userlist);

        if(userlist.length != 0 ) {
            sub.subscribe(userlist);
        }

        res.redirect('/'); 
    });

以及发布到频道的示例 -

....
router.post('/progress', function(req, res, next){
    ....
    ....
    myPorgress.save(function(err){
        if(err) console.dir(err);
            
        pub.publish(req.myAuth.userid, myPorgress);
        res.json({message: "Book progress update successful"});
    });
    ....
});
....

如何为不同的用户创建不同的 redis 子客户端的客户端实例?还是有其他方法可以做同样的工作?

TL;DR

如何在node js express中实现facebook风格的好友通知?我可以使用 Redis PubSub 吗?如果然后怎么办?

【问题讨论】:

    标签: node.js redis socket.io publish-subscribe node-redis


    【解决方案1】:

    我只是通过使用 express-socket.io-session 来解决我的问题。当用户登录时,我将他的关注者列表保存在会话对象中。

    所以我的 user.js 文件变成了

    ...
    
    var userlist = _.pluck(doc, 'user1');
        req.session.followers = userlist;
        console.dir(userlist);
        res.redirect('/'); 
    ...
    

    还有我的 app.js 文件

    ...
    
    io.use(sharedsession(session, {
        autoSave:true
    })); 
    
    io.on('connection', function(socket){
      console.log(io.engine.clientsCount + " client connected.");
    
      //subscribe to friends updates
      var sub = redis.createClient();
    
      if(socket.handshake.session.followers){
        console.log("subscribing.. to " + socket.handshake.session.followers);
        sub.subscribe(socket.handshake.session.followers);
      }
    
      sub.on("message", function(channel, message){
        console.log("Message "+ message + " on channel " + channel+ " arived");
        socket.emit('notification', {data: message});
      });
    
      socket.on('disconnect', function(){
        console.log(io.engine.clientsCount + " client after disconnecct.");
        sub.quit();
      });
    
    });
    
    ...
    

    【讨论】:

      猜你喜欢
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2017-04-16
      • 2018-04-29
      • 2020-07-17
      • 1970-01-01
      • 2018-03-25
      相关资源
      最近更新 更多