集合成员的TTL

时间:2013-06-12 08:12:21

标签: redis set tagging 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) 。是否有更“内部”的方式?

3 个答案:

答案 0 :(得分:38)

不,这是不可能的(和not planned either)。 recommended方法是使用将得分设置为时间戳的有序集,然后手动删除过期的密钥。要查询未过期的密钥,您可以使用ZRANGEBYSCORE $now +inf删除已过期的密钥,ZREMRANGEBYSCORE -inf $now即可。

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

This article更详细地介绍了它。

答案 1 :(得分:25)

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

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

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

Redis, session expiration, and reverse lookup

答案 2 :(得分:0)

您不能直接使列表中的项目失效,但是可以在redis服务器中注册lua脚本并将此功能添加到redis。 Redis Expiration based on value

相关问题