gpt4 book ai didi

node.js - 如何让 EXPIRE 在 TTL 达到 0 时自动更新

转载 作者:IT王子 更新时间:2023-10-29 06:07:01 25 4
gpt4 key购买 nike

我正在构建一个应用程序,我需要有三个记分板,我正在用排序的集合和列表实现这些记分板。该应用程序使用 redis 客户端的 node_redis ( https://github.com/mranney/node_redis) 模块在 node.js 上运行。

第一个记分牌是“最新分数”,我正在使用列表和 LPUSH。第二个是历史最高分,我通过 ZADD 命令使用排序列表。

我在实现“本周高分”时遇到了问题。我在想我应该使用另一个排序列表,使用 ZADD 并将 EXPIRE 设置为一周。一切正常,但在列表第一次过期后,它将永远继续添加到新列表中。

有没有redis命令过期自动续订? (我一直在寻找几个小时的答案,但答案似乎是否定的)。我得出的结论是我需要以编程方式执行此操作。在使用该集合的函数调用期间,我可以检查 TTL 是否为 -1 并立即将其重置。这是最佳做法吗?我在某处错过了一个聪明的把戏吗?我需要担心额外的数据库请求吗?

--编辑--

我已经在推特上回复了这个问题 https://twitter.com/redsmin/status/302177241167691777

建议的解决方案(如果我理解正确的话)是将 EXPIREAT 命令与每个 ZADD

一起使用
expireat myscoreboard {{timestamp of the end of the week}} 
zadd myscoreboard 1 "one"

这“感觉”对我来说是正确的,但我是 redis 的新手,所以希望对这种技术或任何其他解决问题的方法进行一些讨论。

最佳答案

这取决于你如何定义“一周”。有多种使用方式,例如:

  1. “过去 7 天”
  2. “一年中的第几周”
  3. “本周从星期日开始到星期六结束”

最简单的实现方式是 2 和 3。您指定一个集合,其中在其键名中包含开始日期/时间,使用一周的到期时间。然后,您只需在客户端确定您想要哪一天并获取数据。

例如zadd 记分牌:每周:03:2013 年 3 月 1 “鲍勃”

然后下周您的关键字名称将是zadd 记分牌:每周:10:3​​ 月:2013 1 “鲍勃”

当您第一次创建 key 时,您设置了过期时间,仅此而已。无需每次都重新设置。伪代码如下:

如果(ttl记分牌:每周:03:3月:2013)== 0: 到期记分牌:每周:03:3 月:2013 604800

这样您只需设置一次过期时间,自动过期,并且可以轻松拉动每周记分牌。

您可以使用相同的方法实现滚动周,但您需要转到每日 key 名称并计算要获取的 key ,然后合并它们。您可以使用 zunionstore 执行此操作。

关于node.js - 如何让 EXPIRE 在 TTL 达到 0 时自动更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14884235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com