如何为Redis sub设置定时器功能,所以当客户端连接并且在200ms时没有从pubblisher收到消息时,套接字会发出一个事件?
这就是我现在所拥有的:
io.on('connection', function(socket){
const sub = redis.createClient();
sub.subscribe("data");
sub.on("message", function(channel, message) {
io.emit("data", JSON.parse(message));
});
sub.on("error", function(err){
console.log("Error" + err);
});
socket.on("disconnect", function(){
sub.removeListerner('message', function(){
io.emit("disconnected");
})
});
});
答案 0 :(得分:1)
我知道这是一个迟到的问题,但希望这个答案可以帮助别人,或者如果你还没有找到答案。您可以使用一个调用处理函数的超时函数,以防万一收到消息(我猜这就是您的要求)
我也在使用redis,我会调用其他数据库来检查他们是否拥有所请求ID的用户。为了确保用户不会停留并等待,我添加了一个超时功能,我将其设置为500毫秒。所以它是一个竞争条件,以先到者为准我取消订阅redis客户端,以确保它也是一次性的。
return User.mongoose.findAsync({ _id: params.id })
.then ( results => {
if (sails.IS.empty(results)) {
const request_id = Date.now() + '@' + sails.HOST_NAME + '/user/' + params.id
sails.REDIS_SUB.subscribe(request_id)
sails.REDIS_SUB.on('message', (channel, message) => {
if (channel == request_id) {
const data = JSON.parse(message)
sails.dlogwarn(params.id + '\t<=\t(' + data.responder + ')')
sails.REDIS_SUB.unsubscribe(request_id)
return data.params.results
}
})
sails.REDIS_PUB.publish('/user/find', JSON.stringify({
request_id: request_id,
params: {
_id: params.id
}
}))
setTimeout( () => {
sails.REDIS_SUB.unsubscribe(request_id)
return results
}, Number(process.env.REDIS_MAX_QUERY_TIMEOUT))
} else return results
})