集合成员的TTL

Prz*_*mek 56 tagging set ttl redis

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

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

> SETEX id:id_1 100 'Lorem ipsum'
OK
> SADD tag:tag_1 id:id_1
(integer) 1
Run Code Online (Sandbox Code Playgroud)

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

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

我不认为这将是一种有效的方式,我可能希望保持标签尽可能干净,因为集合的大小可能会影响多个标签(SINTER)的搜索性能.有更"内部"的方式吗?

Vác*_*vík 45

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

在我的应用程序中,我每次查询集合时都会发出两个命令.我还将它与设置本身的(长)到期时间结合起来,最终清除未使用的集合.

本文将更详细地介绍它.

  • 到目前为止,这可能是最好的解决方案,直到Redis本身支持它.请记住,插入有序集合将是O(logN). (3认同)
  • 文章链接失效了,有新的网址吗? (2认同)

Did*_*zia 30

无法直接使列表,集或zsets中的项目失效.

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

看到这个问题的答案,我认为它适用于你的用例(用id替换session,用tag替换用户):

Redis,会话到期和反向查找