2013-06-12 36 views
37

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作业,该脚本会定期从集合中删除过期密钥 - 将所有标签名称添加到另一个集合,然后遍历所有标签,然后遍历所有标签标记并检查相应的密钥是否存在 - 如果不存在,则调用SREM

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

回答

15

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

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

看到这个问题的答案,我认为它适用于你的使用情况(按标签替代由ID会话和用户):

Redis, session expiration, and reverse lookup

+0

是的,这是一个体面的方式,我可能会用类似的方式处理这个问题。既然标签集合中过期成员的存在并不是以其他方式表现的问题,那么我很可能会使用定期运行的cron而不是deamon--将投票数限制在足够的最小值。 – Przemek

20

不,这是不可能的(和not planned either )。 recommended方法是使用一个有序集,并将分数设置为时间戳,然后手动删除过期的密钥。要查询未过期的密钥,您可以使用ZRANGEBYSCORE $now +inf来删除过期的密钥,ZREMRANGEBYSCORE -inf $now将会执行此操作。

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

This article更详细地通过它。