Node.js Redis密钥可用时立即响应节点客户端

Node.js Redis密钥可用时立即响应节点客户端,node.js,redis,Node.js,Redis,在节点上,我试图在有一点数据可用时立即向客户端发送响应,如果数据在分配的时间段内不可用,则超时并返回404。数据通过另一个客户端请求传入,该请求可能发生在等待数据的请求之前或之后 我目前的尝试是使用Redis,在数据进入时进行RPUSH,并进行BLPOP以等待数据。它的行为不像我预料的那样 使用redis~0.10.1,我的代码如下所示: 候车区: redisClient.blpop(key, 10, function (err, value) { if (!err &&

在节点上,我试图在有一点数据可用时立即向客户端发送响应,如果数据在分配的时间段内不可用,则超时并返回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();
设置侧:

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。我只是在寻找在“事件发生”(从最抽象的意义上)时回复客户机的任何方法。我愿意接受关于替代方案的建议。

redis协议通常是同步的,因此redis节点客户端将请求排队并串联执行。尝试使用不同的redis连接,您应该会得到预期的结果。

您在等待端和设置端都使用相同的redisClient实例/连接吗?@mscdex是的,我想是的。这是在Heroku/Foreman上运行的一个web.js文件。这可能就是为什么您会看到这种行为。redis协议通常是同步的,因此节点客户机将请求排队并串联执行。尝试使用不同的redis连接,您应该会得到预期的结果。此外,如果这只是在同一个进程中,您可以创建自己的EventEmitter实例并发送事件信号。这样,您就不必“离开”流程,只需直接返回。@mscdex我曾考虑过使用EventEmitter,但随后我必须为何时需要支持节点群集提出解决方案。