gpt4 book ai didi

node.js - 如何提高redis sub的性能?

转载 作者:可可西里 更新时间:2023-11-01 11:12:05 25 4
gpt4 key购买 nike

我有这样的代码

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));

最佳答案

只要您存储 js 对象,就没有办法避免 JSON.parse()/JSON.stringify()。您可以使用不同的序列化格式,如 msgpack,但您仍在调用函数来序列化/反序列化您的数据(还有 JSON.parse()/JSON.stringify()在 Node 中已经很难在性能方面击败)。

我认为您可以使用您提供的代码进行的唯一真正的性能调整是只为所有 客户端而不是为每个客户端解析一次 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]clients[obj.guestSockId] 因为 connected键入 socket.id .

关于node.js - 如何提高redis sub的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25061765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com