【发布时间】:2014-01-20 19:45:53
【问题描述】:
我是“服务器端 JS”的新手,找不到使用 node.js 和 Redis-Sub 进行长轮询的示例。
以下代码运行良好,但今天我注意到 RAM 使用量为 650MB,而代码仅使用了 6 天。
var http = require('http'),
redis = require('redis'),
client = redis.createClient();
client.subscribe("example");
http.createServer(function (req, res) {
res.setHeader('Access-Control-Allow-Origin', 'https://mywebsite.com');
res.setHeader('Access-Control-Allow-Methods', 'GET');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
res.setHeader('Access-Control-Allow-Credentials', true);
res.writeHead(200, {'Content-Type': 'application/json'});
client.on("message", function (channel, message) {
res.end( JSON.stringify( message ) );
});
}).listen(8080);
有人可以指出内存泄漏并解释一下吗?
我的 node.js 版本是:v0.10.21
【问题讨论】:
-
函数
function(req, res)在每次服务器收到请求时运行。每次运行时,都会由client.on("message", ...)设置一个处理程序。这些处理程序不会被删除;因此,每次收到请求时,内存使用量都会增加。不仅如此,每次redis客户端收到消息,都会运行function(channel, message)这个函数。如果res已经被发送,大概它不会做任何事情,但如果有很多处理程序,这可能会产生很大的开销。 (在这种情况下,您会看到每个请求的处理都有延迟。) -
你想做什么?我大致知道我认为它会做什么,而且我看不出有任何合乎逻辑的理由这样做。客户端请求和redis数据有什么联系?