在node.js中并发写入redis
在我的node.js应用程序中,我从AWS Kinesis流中读取消息,我需要在缓存(Redis)中存储最后一分钟的所有消息。我在一个节点worker中运行下一个代码:在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
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个元素”而不是“最后一分钟”,那么会更容易.环顾一下这个工具,你会有一些想法