在node.js

时间:2016-01-08 12:44:24

标签: node.js redis

在我的node.js应用程序中,我从AWS Kinesis流中读取消息,我需要存储所有消息,最后一分钟在缓存中(Redis)。我在一个节点worker中运行下一个代码:

var loopCallback = function(record) {
    var nowMinute = moment.utc(record.Data.ts).minute();
    //get all cached kinesis records
    var key = "kinesis";
    cache.get(key,function (err, cachedData) {
        if (err) {
            utils.logError(err);
        } else {

            if(!cachedData) {
                cachedData = [];
            } else {
                cachedData = JSON.parse(cachedData);
            }

            //get records with the same minute
            var filtered = _.filter(cachedData, function (item) {
                return moment.utc(item.ts).minute() === nowMinute;
            });

            filtered.push(record.Data);

            cache.set(key, JSON.stringify(filtered), function (saveErr) {
                if (saveErr) {
                    utils.logError(saveErr);
                }

                //do other things with record;
            });
        }
    });
};

我在同一时刻收到的大部分记录(几十张)。因此,当我尝试保存它时,某些记录不会被存储。 我理解它是由于竞争条件而发生的。 节点从Redis读取old版本的数组,并在将另一条记录写入缓存时覆盖数组。 我已经阅读过有关redis交易的信息,但据我所知,这对我没有帮助,因为只有一笔交易将完成,其他交易将被拒绝。 在我的情况下有办法将所有记录保存到缓存中吗? 谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用排序集,其分数为Unix时间戳 ZADD kinesis <unixtimestamp> "some data to be cached"

要在不到一分钟前添加元素,请为(现在 - 60秒)创建一个时间戳,然后使用ZRANGEBYSCORE来获取最早的元素: ZRANGEBYSCORE myzset -inf (timestamp

ZREVRANGEBYSCORE如果您想要最新的元素: ZRANGEBYSCORE myzset -inf (timestamp

要删除超过一分钟的元素,请为(现在 - 60秒)创建时间戳,然后使用ZREMRANGEBYSCORE ZREMRANGEBYSCORE myzset -inf (timestamp