编写简单Node redis循环的更好方法(使用ioredis)?

时间:2016-11-05 00:11:33

标签: node.js redis node-redis

所以,我正在用其他语言长时间学习JS / Node方式。

我有一个小型微服务,可以从redis频道读取,temp将其存储在工作频道中,完成工作,移除它并继续前进。如果频道中有更多内容,则会立即重新运行。如果没有,它会设置超时并在1秒内再次检查。

它工作得很好......但是超时轮询似乎不是解决这个问题的“正确”方法。而且我还没有发现使用BRPOPLPUSH试图阻止(对抗RPOPLPUSH)并在Node ....或其他类似选项中等待。 (Pub / Sub在这里不是一个选项......这是唯一的听众,它可能并不总是在听。)

以下是我正在做的事情的简短要点:

var Redis = require('ioredis');
var redis = new Redis();

var redisLoop = function () {
    redis.rpoplpush('channel', 'channel-working').then(function (result) {
        if (result) {
            processJob(result); //do stuff

            //delete the item from the working channel, and check for another item
            redis.lrem('channel-working', 1, result).then(function (result) { });
            redisLoop();
        } else {
            //no items, wait 1 second and try again
            setTimeout(redisLoop, 1000);
        }
    });
};

redisLoop();

我觉得我错过了一些非常明显的东西。谢谢!

1 个答案:

答案 0 :(得分:2)

BRPOPLPUSH无法阻止 Node ,它会在客户端中阻止。在这种情况下,我认为它正是你摆脱民意调查所需要的。

var Redis = require('ioredis');
var redis = new Redis();

var redisLoop = function () {
    redis.brpoplpush('channel', 'channel-working', 0).then(function (result) {
        // because we are using BRPOPLPUSH, the client promise will not resolve
        // until a 'result' becomes available
        processJob(result);

        // delete the item from the working channel, and check for another item
        redis.lrem('channel-working', 1, result).then(redisLoop);
    });
};

redisLoop();

请注意,redis.lrem是异步的,因此您应该使用lrem(...).then(redisLoop)确保只有在从channel-working成功删除项目后才执行下一个滴答。