javascript - Redis:添加到数组一定长度?

标签 javascript node.js redis node-redis

我想在 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/

相关文章:

node.js - 在Heroku上安装Nightmare.js

Javascript 类与类名

javascript - 无法在选择列表上触发更改事件

node.js - 部署到 Digital Ocean 的 Meteor 应用程序卡在 100% CPU 和 OOM

javascript - 使用 npm node 控制台安装模块或在 package.json 中安装模块有什么区别

ruby - 为什么这个 EventMachine Synchrony hiredis 示例返回 DefaultDefferable,而不是请求中的值?

node.js - 比较两个值的计算结果为 false 而不是 true

redis - 如何连接到需要通过 ServiceStack.Redis 传递的 Redis Sentinel?

javascript - 遍历 ViewData 数组并使用 javascript 代码

javascript - 使用 Javascript 将记录插入数据库!