Redis订阅超时

时间:2015-03-13 22:02:31

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

如何为Redis sub设置定时器功能,所以当客户端连接并且在200ms时没有从pubblisher收到消息时,套接字会发出一个事件?

这就是我现在所拥有的:

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

    const sub = redis.createClient();
    sub.subscribe("data");

    sub.on("message", function(channel, message) {
      io.emit("data", JSON.parse(message));
    });

    sub.on("error", function(err){
      console.log("Error" + err);
    });

    socket.on("disconnect", function(){
      sub.removeListerner('message', function(){
        io.emit("disconnected");
      })
    });

});

1 个答案:

答案 0 :(得分:1)

我知道这是一个迟到的问题,但希望这个答案可以帮助别人,或者如果你还没有找到答案。您可以使用一个调用处理函数的超时函数,以防万一收到消息(我猜这就是您的要求)

我也在使用redis,我会调用其他数据库来检查他们是否拥有所请求ID的用户。为了确保用户不会停留并等待,我添加了一个超时功能,我将其设置为500毫秒。所以它是一个竞争条件,以先到者为准我取消订阅redis客户端,以确保它也是一次性的。

return User.mongoose.findAsync({ _id: params.id })
.then ( results => {

    if (sails.IS.empty(results)) {

        const request_id = Date.now() + '@' + sails.HOST_NAME + '/user/' + params.id

        sails.REDIS_SUB.subscribe(request_id)

        sails.REDIS_SUB.on('message', (channel, message) => {
        if (channel == request_id) {

            const data = JSON.parse(message)

            sails.dlogwarn(params.id + '\t<=\t(' + data.responder + ')')

            sails.REDIS_SUB.unsubscribe(request_id)

            return data.params.results
        }
  })

  sails.REDIS_PUB.publish('/user/find', JSON.stringify({
      request_id: request_id,
      params: {
          _id: params.id
      }
  }))

  setTimeout( () => {
      sails.REDIS_SUB.unsubscribe(request_id)
      return results
  }, Number(process.env.REDIS_MAX_QUERY_TIMEOUT))

} else return results
})