如何提高redis sub的性能?

时间:2014-07-31 14:39:08

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

我有类似的代码

var subscribeNewMessages = require("redis").createClient(config.redis.port, config.redis.host);
subscribeNewMessages.subscribe('new-messages');

io.of('/new-messages').on('connection', function (client) {
        subscribeNewMessages.on("message", function(channel, message) {
            var obj = JSON.parse(message);
            if (client.userId == obj.toUserId || client.guestId == obj.toUserId) {
                client.send(message);
            }
            obj = null;
        });
})

我该如何优化它?因为此代码解析每个新消息的字符串json。

当我尝试发布到redis chanel时,我需要JSON.stringify

redis1.publish(channelPrefix, JSON.stringify(clientData));

1 个答案:

答案 0 :(得分:3)

只要您存储js对象,就不可能避免JSON.parse() / JSON.stringify()。您可以使用不同的序列化格式,例如msgpack,但您仍然需要调用函数来序列化/反序列化您的数据(同样JSON.parse() / JSON.stringify()已经很难在节点中击败性能)

我认为您可以使用您提供的代码进行的唯一真正的性能调整是仅针对所有客户端而不是针对每个客户端解析JSON一次。例如:

var subscribeNewMessages = require('redis').createClient(config.redis.port, config.redis.host);
subscribeNewMessages.subscribe('new-messages');

var nsNewMsgs = io.of('/new-messages');
subscribeNewMessages.on('message', function(channel, message) {
  var obj = JSON.parse(message),
      clients = nsNewMsgs.connected,
      ids = Object.keys(clients);
  for (var i = 0, len = ids.length, client; i < len; ++i) {
    client = clients[ids[i]];
    if (client.userId == obj.toUserId || client.guestId == obj.toUserId)
      client.send(message);
  }
});

根据您的应用程序,如果您可以在已发布的消息中存储socket.id值,甚至可以完全避免for循环,那么您只需查找clients[obj.userSockId]和{{ 1}}因为connected上有socket.id