【问题标题】:Redis: add to array for certain length?Redis:添加到数组一定长度?
【发布时间】:2014-10-20 18:58:30
【问题描述】:

我想在 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 中可能会自动执行此操作。

【问题讨论】:

  • 你有你想要做什么的例子吗?也许你到目前为止有什么?

标签: javascript node.js redis node-redis


【解决方案1】:

虽然在 Redis 中没有自动执行此操作的方法,但解决此类问题的常用方法是使用 Redis 排序集。在您的情况下,使用 epoch 表示将 IP 设置为成员的值,并将到期时间(现在 + 生存时间)设置为分数。

您可以每隔一段时间调用一次ZREMRANGEBYSCORE,而不是定期循环。

但是,由于集合成员是唯一的,这意味着您只能将每个 IP 保存一次。如果没问题,只需在每次命中时更新 IP 的分数,否则通过将 IP 与时间戳连接起来使成员值唯一。

最后,要获取尚未“过期”的 IP,请使用 ZRANGEBYSCORE 获取分数(过期时间)高于现在的成员。同样,在使用 ZREMRANGEBYSCORE 删除之前,获取您提到的回调逻辑过期的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多