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

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

第一个记分牌是我使用列表和LPUSH的“最新分数”。 第二个是我使用ZADD命令的sorting列表。

我在本周实施“高分”时遇到了麻烦。 我以为我应该使用另一个sorting列表使用ZADDEXPIRE设置一个星期。 这一切都可以正常工作,但是在列表第一次过期之后,它会一直添加到新列表中。

是否有一个redis命令过期自动更新? (我现在一直在寻找答案几个小时,但答案似乎是否定的)。 我得出的结论是,我需要以编程方式做到这一点。 在使用该函数的函数调用期间,我可以检查TTL是否为-1,然后在那里重新设置。 这是最佳做法吗? 我错过了一个聪明的把戏吗? 我需要关心额外的数据库请求吗?

– 编辑 –

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

build议的解决scheme(如果我理解正确的话)是与每个ZADD一起使用EXPIREAT命令

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

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

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

  1. “过去7天”
  2. “一周”
  3. “本周从周日开始到周六结束”

最简单的实现是2&3.你指定一个集合,在其中包含键名的开始date/时间,使用期限为一周。 然后,您只需在客户端确定您想要的date并获取数据。

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

那么下一周你的键名是zadd记分牌:每周:10:3​​月:2013 1“bob”

当你第一次创build密钥,你设置到期,这就是全部。 无需每次重新设置。 伪代码如下:

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

这样你只设置到期一次,获得自动到期,并可以轻松地拉周记分牌。

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