我正在构建一个应用程序,我需要有三个记分板,我正在使用有序集和列表实现。应用程序使用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的新手,所以会对这种技术或任何其他解决问题的方法进行讨论。
答案 0 :(得分:1)
这取决于你如何定义“一周”。有几种方法可以使用它,例如:
最简单的实施方案是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来做到这一点。