Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在node.js中并发写入redis_Node.js_Redis - Fatal编程技术网

在node.js中并发写入redis

在node.js中并发写入redis,node.js,redis,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"; cach

在我的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交易的文章,但据我所知,这对我没有帮助,因为只有一个交易将被完成,而另一个交易将被拒绝。 在我的案例中,有没有办法将所有记录保存到缓存中?
谢谢

您可以使用排序集,分数是Unix时间戳

ZADD kinesis“一些要缓存的数据”

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

ZRANGEBYSCORE myzset-inf(时间戳

或者,如果您希望首先使用最新的元素:

ZRANGEBYSCORE myzset-inf(时间戳

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

ZREMRANGEBYSCORE myzset-inf(时间戳

为什么要将元素存储为redis字符串值(key=JSON.stringify(..)。您应该将元素存储在redis列表中,例如使用RPUSH。这将绕过您的并发问题。谢谢。但我还需要删除前一分钟的数据,因此它意味着三个命令:LRANGE/DEL/RPUSH?如果您说“仅保留N个元素”而不是“最后一分钟”,那么会更容易.环顾一下这个工具,你会有一些想法