【发布时间】:2019-12-21 00:19:11
【问题描述】:
我有两个从 nodejs 到 Redis 的连接:
- 设置列表变量
- 订阅频道
套接字运行的时间越长,我得到的连接就越多。
我尝试在redis中设置超时值,尝试在socket.io关闭时关闭redis连接
var Redis = require('ioredis');
var globalRedis = new Redis({
port: process.env.REDIS_PORT, // Redis port
host: process.env.REDIS_HOST, // Redis host
family: 4, // 4(IPv4) or 6(IPv6)
db: 1
});
[...]
io.sockets
.on('connection', socketioJwt.authorize({
secret: process.env.JWT_SECRET,
timeout: 15000 // 15 seconds to send the authentication message
}))
.on('authenticated', function(socket) {
var redis = new Redis({
port: process.env.REDIS_PORT,
host: process.env.REDIS_HOST,
// password: process.env.REDIS_PASSWORD,
family: 4,
db: 1
});
socket.on('disconnect', function() {
redis.unsubscribe('channel-'+socket.decoded_token.uid);
});
socket.on('error', function() {
redis.unsubscribe('channel-'+socket.decoded_token.uid);
});
redis.subscribe('channel-'+socket.decoded_token.uid);
redis.on('message', function(channel, message) {
message = JSON.parse(message);
socket.emit('message', message);
});
});
function disconnectUser(userObject){
globalRedis.sismember('online_uids', userObject.uid).then(function(){
globalRedis.srem('online_users', userObject.nickname).then(console.log(userObject.nickname + ' disconnected!'));
globalRedis.srem('online_uids', userObject.uid);
});
}
const port = process.env.SOCKET_PORT;
const host = process.env.SOCKET_URL;
const logger = () => console.log(`Listening: http://${host}:${port}`);
http.listen(port, host, logger);
所以globalRedis 中的连接始终处于活动状态,没有任何问题。
但是随着时间的推移,redis 中的订阅连接会增加,即使我在断开连接和错误时取消订阅。
有什么想法吗?
P.S.:抱歉我的代码和知识不好,这是我的第一个 nodejs。
【问题讨论】:
标签: node.js amazon-web-services redis publish-subscribe