TTL为一个集合成员

在Redis中是否可以将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 )的search性能。 有没有更“内在”的方式?

无法直接过期列表,集或zsets的项目。

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

看到这个问题的答案,我认为这适用于你的用例(用idreplacesession,用tag byreplace):

Redis,会话到期和反向查找

不,这是不可能的(也没有计划 )。 推荐的方法是使用一个有序集合,将分数设置为时间戳,然后手动删除过期的密钥。 要查询未过期的密钥,可以使用ZRANGEBYSCORE $now +inf来删除过期的密钥, ZREMRANGEBYSCORE -inf $now将执行此操作。

在我的应用程序中,我每次查询这个集合时都会发出这两个命令。 我也把这个(长)到期时间结合起来,最终清除未使用的集合。

本文将更详细地介绍它。