设定成员的TTL


71

在Redis中是否可以不为特定密钥设置TTL(生存时间),而是为一组成员设置TTL?

我正在使用Redis文档提出的标签结构-数据是简单的键/值对,并且标签是包含对应于每个标签的键的集合,例如

> SETEX id:id_1 100 'Lorem ipsum'
OK
> SADD tag:tag_1 id:id_1
(integer) 1

密钥id:id_1将按预期到期,但我看不到从tag:tag_1集中删除相应成员的有效方法。

我出现的一种方法是使用包含脚本的cron作业,该脚本将定期从集合中删除过期的密钥-通过将所有标签名称添加到另一个集中,然后遍历所有标签,然后遍历与每个标签对应的所有id并检查是否存在相应的密钥-如果不存在,则调用SREM

我认为这不是一种有效的方法,我可能希望保持标签尽可能整洁,因为集合的大小可能会影响多个标签(SINTER)的搜索性能。还有更“内部”的方式吗?


可能会有所帮助
y2k-shubham

Answers:


35

无法使列表,集合或zset中的项目直接到期。

您需要实现一种机制,以便在主项目到期时得到通知,以便可以相应地维护相应的集合。

请参阅此问题的答案,我认为它适用于您的用例(按ID替换会话,按标签替换用户):

Redis,会话到期和反向查找


是的,这是一种不错的方式,我可能会通过类似的方式解决该问题。由于标记集中是否存在过期成员,这对性能没有任何其他影响,所以我很可能会使用定期运行的cron代替deamon来将民意调查限制在足够的最小值。
Przemek 2013年

61

不,这是不可能的(也没有计划)。该建议的方法是使用一组有序与分数设置为时间标记,然后手动删除过期键。要查询未过期的密钥,可以使用ZRANGEBYSCORE $now +inf,删除过期的密钥,即可ZREMRANGEBYSCORE -inf $now完成操作。

在我的应用程序中,每次查询集合时,我都只发出两个命令。我还将其与集合本身的(较长)到期时间结合在一起,以最终清除未使用的集合。

本文更详细地介绍了它。


4
到目前为止,这可能是最好的解决方案,直到Redis原生支持它为止。请记住,插入到排序集中的将是O(logN)。
linehrr

2
文章链接已断开,是否有新的URL?
鲍勃·怀特洛克

@Bob Whitelock, 可能会有所帮助
y2k-shubham

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.