在我的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交易的信息,但据我所知,这对我没有帮助,因为只有一笔交易将完成,其他交易将被拒绝。
在我的情况下有办法将所有记录保存到缓存中吗?
谢谢
答案 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