如何让一个EXPIRE在TTL达到0时自动更新

时间:2013-02-14 21:19:59

标签: node.js redis

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

第一个记分牌是'最新得分',我正在使用列表和LPUSH。第二个是历史最高分,我正在使用ZADD命令的排序列表。

我在实施本周的“高分”时遇到了麻烦。我想我应该使用ZADD并使用EXPIRE设置一周的其他排序列表。一切正常,但在列表第一次到期后,它将继续永久地添加到新列表中。

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

- 编辑 -

我在twitter https://twitter.com/redsmin/status/302177241167691777

上回复了这个问题

建议的解决方案(如果我理解正确的话)是使用EXPIREAT命令以及每个ZADD

expireat myscoreboard {{timestamp of the end of the week}} 
zadd myscoreboard 1 "one"

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

1 个答案:

答案 0 :(得分:1)

这取决于你如何定义“一周”。有几种方法可以使用它,例如:

  1. “过去7天”
  2. “一年中的一周”
  3. “本周从星期日开始,到星期六结束”
  4. 最简单的实施方案是2& 3。 您指定一个集合,其中包含在其密钥名称中的开始日期/时间,使用一周的过期。然后,您只需在客户端确定所需的日期并获取数据。

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

    接下来的一周,您的密钥名称将是 zadd记分牌:每周:10:3​​月:2013 1“bob”

    当你第一次创建密钥时,你设置了expires,就是这样。无需每次都重新设置它。伪代码如下:

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

    这样您只需设置一次到期,获得自动过期,并可轻松拉出每周记分牌。

    您可以使用相同的方法实现滚动周,但您需要转到每日密钥名称并计算要获取的密钥,然后合并它们。你可以使用zunionstore来做到这一点。

相关问题