为什么redis + socket.io的性能比socket.io更好?

时间:2014-08-26 11:29:19

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

我之前在socket.io + node.js服务器上有我的所有代码。我最近将所有代码转换为redis + socket.io + socket.io + node.js,当有太多用户在服务器上发送消息时注意到性能降低。 所以,为什么socket.io本身很慢,因为它不是多线程的,所以它处理一个请求或一次发出。 redis所做的是跨通道分发这些请求或发出。客户端订阅不同的频道,当在频道上发布消息时,订阅它的所有客户端都会收到该消息。它是通过这段代码完成的:

sub.on("message", function (channel, message) {
  client.emit("message",message);
});

client.on('emit',function(){})从此处获取它以将消息发布到不同的通道。

这是一个简短的代码,用于解释我正在使用redis做什么:

io.sockets.on('connection', function (client) {
var pub = redis.createClient();
var sub = redis.createClient();
sub.on("message", function (channel, message) {
    client.emit('message',message);
});
client.on("message", function (msg) {
if(msg.type == "chat"){
    pub.publish("channel." + msg.tousername,msg.message);
    pub.publish("channel." + msg.user,msg.message);
}
else if(msg.type == "setUsername"){
  sub.subscribe("channel." +msg.user);
}
});

});

当redis存储频道信息时,我们可以将不同的服务器发布到同一频道。

所以,我不明白的是,如果每次发送请求或发出时调用sub.on(“message”),为什么redis应该提供更好的性能?我想甚至sub.on(“message”)方法也不是多线程的。

1 个答案:

答案 0 :(得分:0)

您可能知道,Redis允许您使用多个node实例进行扩展。所以性能实际上是在事后发生的。使用Pub/Sub方法并不快。它在技术上较慢,因为您必须在每个Redis信号的Pub/Sign之间进行通信。当你开始横向扩展时,“提供更好的性能”才是真的。

例如,您有一个 node实例(简单聊天室) - 可以处理最多200个活跃用户。您还没有使用Redis,因为没有必要。现在,如果您想拥有400活跃用户,该怎么办?在使用上面的示例时,您现在可以实现此400用户标记,这是“性能提升”。从某种意义上说,您现在可以处理更多用户,但实际上不会增加​​速度。如果这是有道理的。希望这有帮助!