31

我想知道 redis 中是否有一个功能可以让我获取所有过期的密钥(我的意思是某种事件,这让我有机会收回所有过期的记录)。它的目的是将旧值保存到另一个数据库中。我听说可以使用发布机制,但谷歌无法帮助我们实现这个想法。

4

3 回答 3

26

当前的 redis 开发版本包含一个新特性:keyspace 通知。文档:http ://redis.io/topics/notifications

Keyspace 通知允许客户端订阅 Pub/Sub 频道,以便接收以某种方式影响 Redis 数据集的事件。

可能接收的事件示例如下:

  • 影响给定键的所有命令。
  • 所有接受 LPUSH 操作的键。
  • 数据库 0 中所有过期的密钥。

希望它会尽快稳定下来。

顺便说一句,它在帮助您保存过期密钥的值方面不是很有用。当过期事件被触发时,该值已经消失。

于 2013-02-01T18:41:09.957 回答
15

键空间通知生成的内置过期事件不准确。请参阅http://redis.io/topics/notifications的最后一部分

Redis 以两种方式使与生存时间相关联的密钥过期:

  1. 当密钥被命令访问并发现已过期时。

  2. 通过后台系统在后台逐步查找过期密钥,以便能够收集从未访问过的密钥。

过期事件是在访问密钥并被上述系统之一发现过期时生成的,因此无法保证 Redis 服务器能够在密钥生存时间产生过期事件达到零值。如果没有命令始终以密钥为目标,并且有许多密钥与 TTL 相关联,则密钥生存时间下降到零的时间与生成过期事件的时间之间可能存在显着延迟。

要完全实现应计过期事件,您可能必须自己实现它。例如,通过使用按过期时间排序的排序列表(或 AVL 树),并不断读取列表的尾部(取消队列)。如果阅读器发现过期时间还没有到达,它会休眠(过期时间 - 现在)。这样精度可以控制在10s ms以内。

于 2014-05-27T02:41:00.737 回答
2

使用redis-scheduler.
你可以在这里找到

于 2015-02-27T14:29:21.860 回答