我想在 Redis 中有一个数组(使用 Node),我可以在其中添加值并指定我希望它在其中保留多长时间。在那个时间限制之后,它们应该被删除,理想情况下能够调用一些东西,这样我就知道刚刚剩下了什么。前任。我可能会收到 120 秒的请求,所以我想将该值添加到 map 中那么长的时间,然后将其删除。
有更好的方法吗?我想过使用 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可以自动执行此操作。
最佳答案
虽然在 Redis 中没有自动执行此操作的方法,但解决此类问题的常用方法是使用 Redis 排序集。在您的情况下,将 IP 设置为成员的值,并将到期时间(现在 + 生存时间)设置为使用纪元表示的分数。
无需定期循环,您只需调用 ZREMRANGEBYSCORE每隔一段时间。
但是,由于集合成员是唯一的,这意味着您只能为每个 IP 保存一次。如果没问题,只需在每次点击时更新 IP 的分数,否则通过将 IP 与时间戳连接起来使成员值唯一。
最后,要获取尚未“过期”的 IP,请使用 ZRANGEBYSCORE 获取分数(过期时间)高于现在的成员。类似地,在使用 ZREMRANGEBYSCORE 删除之前,为您提到的回调逻辑获取过期的键。
关于javascript - Redis:添加到数组一定长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26472961/