我想在Redis中使用一个数组(使用Node),我可以在其中添加值并指定我希望它保留多久。在那个时间限制之后,它们应该被删除,理想情况下可以调用一些东西,所以我知道刚才剩下的东西。恩。我可能会收到120秒的请求,因此我想将该值添加到地图中,然后将其删除。
有更好的方法吗?我想过使用EXPIRE,但这似乎只适用于键,而不是数组中的元素?
任何想法都会很棒。
这就是我在做的事情:
app.get('/session/:length', function(req, res) {
var length = parseInt(req.param('length'), 10);
addToArray(length, ip)
var ip = req.connection.remoteAddress;
res.json({ip: ip, length: length});
});
基本上,当我将它添加到数组时,我希望它只在传入的时间内将它保存在数组中。所以,如果你说30秒,它在该数组中持续30秒,并且然后就消失了,并拨回电话。也许有更好的方法来解决这个问题?
我现在所做的是保持添加的时间和ip,时间在一个数组中并定期循环数组检查和删除,但想想也许在redis中可以自动执行此操作。
答案 0 :(得分:2)
虽然在Redis中没有自动的方法,但解决这类问题的常用方法是使用Redis排序集。在您的情况下,使用纪元表示将IP设置为成员的值和到期时间(现在+生存时间)作为分数。
您可以偶尔每隔一段时间拨打ZREMRANGEBYSCORE,而不是定期循环播放。
由于设置成员是唯一的,这意味着您只能保存每个IP一次。如果没关系,只需更新每次点击的IP分数,否则通过将IP与时间戳连接来使成员值唯一。
最后,要获取未“过期”的IP,请使用ZRANGEBYSCORE来获得分数(到期时间)高于现在的成员。同样地,在使用ZREMRANGEBYSCORE删除之前,获取您提到的回调逻辑的过期密钥。