编辑2:澄清:代码已经在未命中逻辑上刷新缓存。我正在尝试做的是减少错过缓存命中的数量。
我使用 Redis 作为 API 的缓存。这个想法是,当 API 收到调用时,它首先检查缓存,如果数据不在缓存中,API 将获取它并在下次缓存它。
目前配置如下:
maxmemory 50mb
maxmemory-policy allkeys-lru
也就是说,最多使用 50mb 内存,不断尝试其中的键,当内存已满时,通过删除最近最少使用的键(lru)开始。
现在我想介绍第二类按键。对于第二个类别,我将设置一定的到期时间。现在我想建立一种机制,以便当这些密钥到期时,该机制启动并刷新它们(并设置新的到期日)。
我该怎么做?
编辑: 一些进展。事实证明,Redis 有一个发布/订阅消息系统,特别可以根据事件分发消息。其中之一是过期密钥,可以这样启用:
notify-keyspace-events Ex
我发现这段代码可以描述一个阻塞的python进程订阅Redis的消息系统。可以轻松更改它以检测密钥过期并在密钥过期时调用 API,然后 API 将刷新密钥。
def work(self, item):
requests.get('http://apiurl/?q={param}'.format(param=item['data']))
所以这正是我所问的。
通常,这感觉太危险且失控。我可以想象在很多不同的情况下,这很快就会失败。
那么,有什么更好的解决方案吗?
http://redis.io/topics/notifications
Keyspace 通知允许客户端订阅 Pub/Sub 频道 为了接收以某种方式影响 Redis 数据集的事件。 可能接收的事件示例如下:
数据库 0 中的所有密钥均已过期。(例如)
...
EXPIRE 当键设置过期时生成过期事件,或者 每次将过期结果设置到密钥中时都会发生过期事件 被删除(有关更多信息,请参阅 EXPIRE 文档)。
要使密钥过期,只需使用 Redis 内置的过期机制即可。您不需要在过期时刷新缓存内容,最简单的方法是在代码遇到缓存未命中时刷新。