【发布时间】:2015-10-02 11:48:41
【问题描述】:
比如说,我在 Redis 数据库中有 4 个键。从现在开始,密钥的有效期为 10 秒。我已将密钥添加到集合中。当密钥过期时,它们实际上不再存在于数据库中(get 返回空值)。但是,键仍然是集合的成员。该集合将继续存在,直到从集合中删除键,此时它太有效地从数据库中消失了。
是否可以在密钥过期时自动从其所属的集合中删除密钥?
我正在考虑为每个键维护一个集合以维护它所属的集合(在键和集合之间建立有向图集合关系),然后注册键过期事件以在必要时删除集合成员。作为数据库的消费者,而不是作为内部的某种后台清理线程,这是很多开销。而且,这种方法是清理集合的“最大努力”,因为订阅过期事件的消费者代码可能会崩溃、无法收到通知、积压等。
我可以通过将键集建模为哈希集中的字段来避免任何欺骗,但我希望在实践中每个键具有不同的到期 TTL。如果可以,那又如何呢?
例如,这是我的一组“foo”键。
mine:0>set foo1 barA
OK
mine:0>set foo2 barB
OK
mine:0>set foo3 barC
OK
mine:0>set foo4 barD
OK
它们可以添加到集合中。
mine:0>sadd foo foo1 foo2 foo3 foo4
4
mine:0>smembers foo
1) foo1
2) foo3
3) foo4
4) foo2
然后密钥可以过期...
mine:0>expire foo1 10
1
mine:0>expire foo2 10
1
mine:0>expire foo3 10
1
mine:0>expire foo4 10
1
mine:0>get foo1
NULL
mine:0>get foo2
NULL
mine:0>get foo3
NULL
mine:0>get foo4
NULL
mine:0>get foo5
NULL
此时键不存在,但集合存在,并且它引用了键。
mine:0>smembers foo
1) foo1
2) foo3
3) foo4
4) foo2
显式移除键会将它们从集合中移除,然后在全部移除后使集合不存在。
mine:0>srem foo foo1
1
mine:0>srem foo foo2
1
mine:0>srem foo foo3
1
mine:0>srem foo foo4
1
mine:0>smembers foo
[nothing returned]
【问题讨论】:
-
你为什么不在集合上设置一个过期时间,与那里添加的密钥相同或最小/最大?
标签: redis