在节点上,我尝试在一些数据可用时立即向客户端发送响应,并且如果数据在指定的时间段内没有变得可用,则超时并返回404。数据通过另一个客户端请求进入,该请求可能在请求等待数据之前或之后发生。
我目前的尝试是使用Redis并在数据进入时执行RPUSH并执行BLPOP以等待数据。它没有像我期望的那样表现。
使用redis~0.10.1,我的代码看起来像这样:
等待方:
redisClient.blpop(key, 10, function (err, value) {
if (!err && value) {
res.send(value);
} else {
res.send(404);
}
});
设置方:
redisClient.rpush(key, 'something');
redisClient.expire(key, 30);
res.end();
我的期望是在进行RPUSH调用后立即调用BLPOP回调。但是,BLPOP超时,我只能在随后的请求中读取密钥+调用BLPOP。
我的问题的第一部分是关于将我的期望与节点上RPUSH / BLPOP的实际预期行为保持一致。
我的问题的第二部分:我真的不必使用Redis。我正在寻找任何方式在发生"事件时回复客户端" (在最抽象的意义上)。我愿意接受替代方案的建议。
答案 0 :(得分:1)
redis协议通常是同步的,因此redis节点客户端将请求排队并按顺序执行。尝试使用不同的redis连接,你应该得到预期的结果。